qemu_domain.h 36.0 KB
Newer Older
1 2 3
/*
 * qemu_domain.h: QEMU domain private state
 *
4
 * Copyright (C) 2006-2016 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __QEMU_DOMAIN_H__
# define __QEMU_DOMAIN_H__

27
# include "virthread.h"
28
# include "vircgroup.h"
29
# include "virperf.h"
30
# include "domain_addr.h"
31
# include "domain_conf.h"
32
# include "snapshot_conf.h"
33
# include "qemu_monitor.h"
D
Daniel P. Berrange 已提交
34
# include "qemu_agent.h"
35
# include "qemu_conf.h"
36
# include "qemu_capabilities.h"
37
# include "virmdev.h"
38
# include "virchrdev.h"
39
# include "virobject.h"
40
# include "logging/log_manager.h"
41

42 43 44 45
# define QEMU_DOMAIN_FORMAT_LIVE_FLAGS      \
    (VIR_DOMAIN_XML_SECURE |                \
     VIR_DOMAIN_XML_UPDATE_CPU)

46
# if ULONG_MAX == 4294967295
P
Philipp Hahn 已提交
47
/* QEMU has a 64-bit limit, but we are limited by our historical choice of
48
 * representing bandwidth in a long instead of a 64-bit int.  */
49
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX ULONG_MAX
50
# else
51
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX (INT64_MAX / (1024 * 1024))
52
# endif
53

54
# define JOB_MASK(job)                  (1 << (job - 1))
55
# define QEMU_JOB_DEFAULT_MASK          \
56 57 58
    (JOB_MASK(QEMU_JOB_QUERY) |         \
     JOB_MASK(QEMU_JOB_DESTROY) |       \
     JOB_MASK(QEMU_JOB_ABORT))
59

60 61 62 63 64
/* Jobs which have to be tracked in domain state XML. */
# define QEMU_DOMAIN_TRACK_JOBS         \
    (JOB_MASK(QEMU_JOB_DESTROY) |       \
     JOB_MASK(QEMU_JOB_ASYNC))

65 66 67
/* Only 1 job is allowed at any time
 * A job includes *all* monitor commands, even those just querying
 * information, not merely actions */
68
typedef enum {
69
    QEMU_JOB_NONE = 0,  /* Always set to 0 for easy if (jobActive) conditions */
70 71 72 73
    QEMU_JOB_QUERY,         /* Doesn't change any state */
    QEMU_JOB_DESTROY,       /* Destroys the domain (cannot be masked out) */
    QEMU_JOB_SUSPEND,       /* Suspends (stops vCPUs) the domain */
    QEMU_JOB_MODIFY,        /* May change state */
74
    QEMU_JOB_ABORT,         /* Abort current async job */
75
    QEMU_JOB_MIGRATION_OP,  /* Operation influencing outgoing migration */
76

77
    /* The following two items must always be the last items before JOB_LAST */
78 79
    QEMU_JOB_ASYNC,         /* Asynchronous job */
    QEMU_JOB_ASYNC_NESTED,  /* Normal job within an async job */
80 81

    QEMU_JOB_LAST
82
} qemuDomainJob;
83
VIR_ENUM_DECL(qemuDomainJob)
84 85 86 87 88

/* Async job consists of a series of jobs that may change state. Independent
 * jobs that do not change state (and possibly others if explicitly allowed by
 * current async job) are allowed to be run even if async job is active.
 */
89
typedef enum {
90 91 92 93 94
    QEMU_ASYNC_JOB_NONE = 0,
    QEMU_ASYNC_JOB_MIGRATION_OUT,
    QEMU_ASYNC_JOB_MIGRATION_IN,
    QEMU_ASYNC_JOB_SAVE,
    QEMU_ASYNC_JOB_DUMP,
95
    QEMU_ASYNC_JOB_SNAPSHOT,
96
    QEMU_ASYNC_JOB_START,
97 98

    QEMU_ASYNC_JOB_LAST
99
} qemuDomainAsyncJob;
100
VIR_ENUM_DECL(qemuDomainAsyncJob)
101

102 103 104
typedef enum {
    QEMU_DOMAIN_JOB_STATUS_NONE = 0,
    QEMU_DOMAIN_JOB_STATUS_ACTIVE,
105
    QEMU_DOMAIN_JOB_STATUS_MIGRATING,
106
    QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED,
107
    QEMU_DOMAIN_JOB_STATUS_POSTCOPY,
108 109 110 111 112
    QEMU_DOMAIN_JOB_STATUS_COMPLETED,
    QEMU_DOMAIN_JOB_STATUS_FAILED,
    QEMU_DOMAIN_JOB_STATUS_CANCELED,
} qemuDomainJobStatus;

113 114 115 116 117 118 119 120

typedef struct _qemuDomainMirrorStats qemuDomainMirrorStats;
typedef qemuDomainMirrorStats *qemuDomainMirrorStatsPtr;
struct _qemuDomainMirrorStats {
    unsigned long long transferred;
    unsigned long long total;
};

J
Jiri Denemark 已提交
121 122 123
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
124
    qemuDomainJobStatus status;
125
    virDomainJobOperation operation;
J
Jiri Denemark 已提交
126
    unsigned long long started; /* When the async job started */
127
    unsigned long long stopped; /* When the domain's CPUs were stopped */
128 129 130 131
    unsigned long long sent; /* When the source sent status info to the
                                destination (only for migrations). */
    unsigned long long received; /* When the destination host received status
                                    info from the source (migrations only). */
J
Jiri Denemark 已提交
132 133
    /* Computed values */
    unsigned long long timeElapsed;
J
Jiri Denemark 已提交
134
    long long timeDelta; /* delta = received - sent, i.e., the difference
135 136 137 138 139
                            between the source and the destination time plus
                            the time between the end of Perform phase on the
                            source and the beginning of Finish phase on the
                            destination. */
    bool timeDeltaSet;
J
Jiri Denemark 已提交
140
    /* Raw values from QEMU */
141
    qemuMonitorMigrationStats stats;
142
    qemuDomainMirrorStats mirrorStats;
J
Jiri Denemark 已提交
143 144
};

145
struct qemuDomainJobObj {
146
    virCond cond;                       /* Use to coordinate jobs */
147
    qemuDomainJob active;               /* Currently running job */
148
    unsigned long long owner;           /* Thread id which set current job */
149
    const char *ownerAPI;               /* The API which owns the job */
J
Jiri Denemark 已提交
150
    unsigned long long started;         /* When the current job started */
151

152
    virCond asyncCond;                  /* Use to coordinate with async jobs */
153
    qemuDomainAsyncJob asyncJob;        /* Currently active async job */
154
    unsigned long long asyncOwner;      /* Thread which set current async job */
155
    const char *asyncOwnerAPI;          /* The API which owns the async job */
J
Jiri Denemark 已提交
156
    unsigned long long asyncStarted;    /* When the current async job started */
J
Jiri Denemark 已提交
157
    int phase;                          /* Job phase (mainly for migrations) */
158
    unsigned long long mask;            /* Jobs allowed during async job */
159
    bool dump_memory_only;              /* use dump-guest-memory to do dump */
J
Jiri Denemark 已提交
160
    qemuDomainJobInfoPtr current;       /* async job progress data */
161
    qemuDomainJobInfoPtr completed;     /* statistics data of a recently completed job */
162
    bool abortJob;                      /* abort of the job requested */
163 164
    bool spiceMigration;                /* we asked for spice migration and we
                                         * should wait for it to finish */
165
    bool spiceMigrated;                 /* spice migration completed */
166
    bool postcopyEnabled;               /* post-copy migration was enabled */
167 168
};

169
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
170 171
                                          virDomainObjPtr vm);

J
John Ferlan 已提交
172
# define QEMU_DOMAIN_MASTER_KEY_LEN 32  /* 32 bytes for 256 bit random key */
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188


/* helper data types for async device unplug */
typedef enum {
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_NONE = 0,
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_OK,
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_GUEST_REJECTED,
} qemuDomainUnpluggingDeviceStatus;

typedef struct _qemuDomainUnpluggingDevice qemuDomainUnpluggingDevice;
typedef qemuDomainUnpluggingDevice *qemuDomainUnpluggingDevicePtr;
struct _qemuDomainUnpluggingDevice {
    const char *alias;
    qemuDomainUnpluggingDeviceStatus status;
};

189 190 191 192 193 194 195 196 197 198

typedef enum {
    QEMU_DOMAIN_NS_MOUNT = 0,
    QEMU_DOMAIN_NS_LAST
} qemuDomainNamespace;
VIR_ENUM_DECL(qemuDomainNamespace)

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
/* Type of domain secret */
typedef enum {
    VIR_DOMAIN_SECRET_INFO_TYPE_PLAIN = 0,
    VIR_DOMAIN_SECRET_INFO_TYPE_AES,  /* utilize GNUTLS_CIPHER_AES_256_CBC */

    VIR_DOMAIN_SECRET_INFO_TYPE_LAST
} qemuDomainSecretInfoType;

typedef struct _qemuDomainSecretPlain qemuDomainSecretPlain;
typedef struct _qemuDomainSecretPlain *qemuDomainSecretPlainPtr;
struct _qemuDomainSecretPlain {
    char *username;
    uint8_t *secret;
    size_t secretlen;
};

# define QEMU_DOMAIN_AES_IV_LEN 16   /* 16 bytes for 128 bit random */
                                     /*    initialization vector */
typedef struct _qemuDomainSecretAES qemuDomainSecretAES;
typedef struct _qemuDomainSecretAES *qemuDomainSecretAESPtr;
struct _qemuDomainSecretAES {
    char *username;
    char *alias;      /* generated alias for secret */
    char *iv;         /* base64 encoded initialization vector */
    char *ciphertext; /* encoded/encrypted secret */
};

typedef struct _qemuDomainSecretInfo qemuDomainSecretInfo;
typedef qemuDomainSecretInfo *qemuDomainSecretInfoPtr;
struct _qemuDomainSecretInfo {
    qemuDomainSecretInfoType type;
    union {
        qemuDomainSecretPlain plain;
        qemuDomainSecretAES aes;
    } s;
};

236 237 238
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
239 240
    virQEMUDriverPtr driver;

241
    struct qemuDomainJobObj job;
242

243 244
    virBitmapPtr namespaces;

245
    qemuMonitorPtr mon;
246
    virDomainChrSourceDefPtr monConfig;
E
Eric Blake 已提交
247
    bool monJSON;
248 249
    bool monError;
    unsigned long long monStart;
D
Daniel P. Berrange 已提交
250 251 252 253

    qemuAgentPtr agent;
    bool agentError;

254
    bool gotShutdown;
255
    bool beingDestroyed;
256
    char *pidfile;
257

258
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
259
    virDomainUSBAddressSetPtr usbaddrs;
260

261
    virQEMUCapsPtr qemuCaps;
262
    char *lockState;
263 264

    bool fakeReboot;
265 266

    int jobs_queued;
267 268

    unsigned long migMaxBandwidth;
J
Jiri Denemark 已提交
269
    char *origname;
270
    int nbdPort; /* Port used for migration with NBD */
271
    unsigned short migrationPort;
272
    int preMigrationState;
273

274
    virChrdevsPtr devs;
275 276 277 278

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
279 280

    virCgroupPtr cgroup;
281

282 283
    virPerfPtr perf;

284 285
    qemuDomainUnpluggingDevice unplug;

286
    char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
287 288

    bool hookRun;  /* true if there was a hook run over this domain */
289 290

    /* Bitmaps below hold data from the auto NUMA feature */
291
    virBitmapPtr autoNodeset;
292
    virBitmapPtr autoCpuset;
293 294 295

    bool signalIOError; /* true if the domain condition should be signalled on
                           I/O error */
296 297
    bool signalStop; /* true if the domain condition should be signalled on
                        QMP STOP event */
298
    char *machineName;
299 300
    char *libDir;            /* base path for per-domain files */
    char *channelTargetDir;  /* base path for per-domain channel targets */
J
John Ferlan 已提交
301 302 303 304 305

    /* random masterKey and length for encryption (not to be saved in our */
    /* private XML) - need to restore at process reconnect */
    uint8_t *masterKey;
    size_t masterKeyLen;
306 307 308

    /* note whether memory device alias does not correspond to slot number */
    bool memAliasOrderMismatch;
309

310 311 312
    /* for migrations using TLS with a secret (not to be saved in our */
    /* private XML). */
    qemuDomainSecretInfoPtr migSecinfo;
313

314 315 316
    /* Used when fetching/storing the current 'tls-creds' migration setting */
    /* (not to be saved in our private XML). */
    char *migTLSAlias;
317 318 319 320

    /* CPU def used to start the domain when it differs from the one actually
     * provided by QEMU. */
    virCPUDefPtr origCPU;
321 322 323

    /* If true virtlogd is used as stdio handler for character devices. */
    bool chardevStdioLogd;
324 325
};

326 327
# define QEMU_DOMAIN_PRIVATE(vm)	\
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
328

329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
# define QEMU_DOMAIN_DISK_PRIVATE(disk)	\
    ((qemuDomainDiskPrivatePtr) (disk)->privateData)

typedef struct _qemuDomainDiskPrivate qemuDomainDiskPrivate;
typedef qemuDomainDiskPrivate *qemuDomainDiskPrivatePtr;
struct _qemuDomainDiskPrivate {
    virObject parent;

    /* ideally we want a smarter way to interlock block jobs on single qemu disk
     * in the future, but for now we just disallow any concurrent job on a
     * single disk */
    bool blockjob;

    /* for some synchronous block jobs, we need to notify the owner */
    int blockJobType;   /* type of the block job from the event */
    int blockJobStatus; /* status of the finished block job */
    bool blockJobSync; /* the block job needs synchronized termination */
346 347

    bool migrating; /* the disk is being migrated */
348 349 350 351

    /* for storage devices using auth/secret
     * NB: *not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr secinfo;
352

J
John Ferlan 已提交
353 354 355 356 357
    /* for storage devices using encryption/secret
     * Can have both <auth> and <encryption> for some disks
     * NB:*not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr encinfo;

358 359 360
    /* information about the device */
    bool tray; /* device has tray */
    bool removable; /* device media can be removed/changed */
361 362
};

363 364 365
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

366 367 368 369 370 371

typedef struct _qemuDomainVcpuPrivate qemuDomainVcpuPrivate;
typedef qemuDomainVcpuPrivate *qemuDomainVcpuPrivatePtr;
struct _qemuDomainVcpuPrivate {
    virObject parent;

372
    pid_t tid; /* vcpu thread id */
373
    int enable_id; /* order in which the vcpus were enabled in qemu */
374
    int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
375
    char *alias;
376
    bool halted;
377 378 379 380 381 382

    /* information for hotpluggable cpus */
    char *type;
    int socket_id;
    int core_id;
    int thread_id;
383
    int node_id;
384
    int vcpus;
385 386 387 388 389 390
};

# define QEMU_DOMAIN_VCPU_PRIVATE(vcpu)    \
    ((qemuDomainVcpuPrivatePtr) (vcpu)->privateData)


391 392 393
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
394
    bool tray;
395
    bool tray_open;
396
    bool empty;
397
    int io_status;
398
    char *nodename;
399 400
};

401 402 403 404 405 406 407 408 409 410
typedef struct _qemuDomainHostdevPrivate qemuDomainHostdevPrivate;
typedef qemuDomainHostdevPrivate *qemuDomainHostdevPrivatePtr;
struct _qemuDomainHostdevPrivate {
    virObject parent;

    /* for hostdev storage devices using auth/secret
     * NB: *not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr secinfo;
};

411 412
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)	\
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
413

414 415 416
typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate;
typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr;
struct _qemuDomainChrSourcePrivate {
417 418 419 420 421 422 423 424
    virObject parent;

    /* for char devices using secret
     * NB: *not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr secinfo;
};


C
Chen Fan 已提交
425 426
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
427
    QEMU_PROCESS_EVENT_GUESTPANIC,
428
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
429
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
430
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
431
    QEMU_PROCESS_EVENT_BLOCK_JOB,
432
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
433 434 435 436 437

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
438
    virDomainObjPtr vm;
C
Chen Fan 已提交
439
    qemuProcessEventType eventType;
440
    int action;
441
    int status;
442
    void *data;
443 444
};

445 446 447
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

448 449 450 451
typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
struct _qemuDomainSaveCookie {
    virObject parent;
452 453

    virCPUDefPtr cpu;
454 455 456 457
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

458
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
459
                                            int phase);
460
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
461 462
                                      const char *phase);

463
void qemuDomainEventFlush(int timer, void *opaque);
464

465
void qemuDomainEventQueue(virQEMUDriverPtr driver,
466
                          virObjectEventPtr event);
467 468
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
469

470
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
471
                          virDomainObjPtr obj,
472
                          qemuDomainJob job)
473
    ATTRIBUTE_RETURN_CHECK;
474
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
475
                               virDomainObjPtr obj,
476 477
                               qemuDomainAsyncJob asyncJob,
                               virDomainJobOperation operation)
478
    ATTRIBUTE_RETURN_CHECK;
479 480 481 482
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
483

484 485 486 487
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
488
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
489
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
490 491
                              virDomainObjPtr obj,
                              int phase);
492 493
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
494 495
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
496
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
497
                                  virDomainObjPtr obj);
498
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
499

500 501
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
502
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
503 504
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
505 506
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
507 508
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
509
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
510
                                   virDomainObjPtr obj,
511
                                   qemuDomainAsyncJob asyncJob)
512
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
513 514


515
qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
516
    ATTRIBUTE_NONNULL(1);
517 518
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
519 520


521 522 523 524
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
525

526 527 528 529
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

530
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
531 532 533 534
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

535
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
536
                             virDomainDefPtr vm,
537
                             unsigned int flags);
538

539
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
540
                          virDomainObjPtr vm,
541
                          unsigned int flags);
542

543
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
544
                              virDomainDefPtr def,
545
                              virCPUDefPtr origCPU,
546 547
                              bool inactive,
                              bool compatible);
548

549
void qemuDomainObjTaint(virQEMUDriverPtr driver,
550
                        virDomainObjPtr obj,
551
                        virDomainTaintFlags taint,
552
                        qemuDomainLogContextPtr logCtxt);
553

554
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
555
                             virDomainObjPtr obj,
556
                             qemuDomainLogContextPtr logCtxt);
557
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
558
                                 virDomainObjPtr obj,
559
                                 virDomainDiskDefPtr disk,
560
                                 qemuDomainLogContextPtr logCtxt);
561 562 563
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
564
                                    qemuDomainLogContextPtr logCtxt);
565
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
566
                                virDomainObjPtr obj,
567
                                virDomainNetDefPtr net,
568
                                qemuDomainLogContextPtr logCtxt);
569

570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
typedef enum {
    QEMU_DOMAIN_LOG_CONTEXT_MODE_START,
    QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH,
    QEMU_DOMAIN_LOG_CONTEXT_MODE_STOP,
} qemuDomainLogContextMode;

qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver,
                                                virDomainObjPtr vm,
                                                qemuDomainLogContextMode mode);
int qemuDomainLogContextWrite(qemuDomainLogContextPtr ctxt,
                              const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(2, 3);
ssize_t qemuDomainLogContextRead(qemuDomainLogContextPtr ctxt,
                                 char **msg);
int qemuDomainLogContextGetWriteFD(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextMarkPosition(qemuDomainLogContextPtr ctxt);
585

586 587
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

588 589 590 591 592
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

593
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
594 595 596

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
597
                                    virCapsPtr caps,
598
                                    virDomainXMLOptionPtr xmlopt,
599 600
                                    char *snapshotDir);

601
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
602 603 604 605 606
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

607
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
608 609 610 611 612
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

613 614 615
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
616
    virQEMUDriverPtr driver;
617 618 619 620 621 622
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

623 624 625
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
626

627
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
628 629
                                         virDomainObjPtr vm);

630
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
631 632
                              virDomainObjPtr vm);

633 634 635
void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

636
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
637 638 639
                             virDomainObjPtr vm,
                             bool value);

640
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
641
                          qemuDomainJob job);
M
Michal Privoznik 已提交
642

643 644
int qemuDomainCheckDiskPresence(virConnectPtr conn,
                                virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
645
                                virDomainObjPtr vm,
646
                                unsigned int flags);
647

648
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
649
                                 virDomainObjPtr vm,
650
                                 virDomainDiskDefPtr disk,
651 652
                                 bool force_probe,
                                 bool report_broken);
653

654
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
655 656
                                 virDomainDiskDefPtr origDisk);

657 658 659
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

660 661 662
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
663
char *qemuDomainStorageAlias(const char *device, int depth);
664

665 666 667 668 669 670 671 672
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

673 674 675 676
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
677
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
678 679
                          virDomainObjPtr vm);

680 681
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
682
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
683
extern virDomainABIStability virQEMUDriverDomainABIStability;
684
extern virSaveCookieCallbacks virQEMUDriverDomainSaveCookie;
685

686
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
687
                               virDomainObjPtr vm, int asyncJob);
688

689 690 691 692
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

693 694 695
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
696

697 698 699 700
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

701
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
702 703
                              bool reportError);

J
Jiri Denemark 已提交
704 705
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
706 707
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
708 709 710 711 712 713 714 715 716 717
int qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
                            virDomainJobInfoPtr info)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
                              int *type,
                              virTypedParameterPtr *params,
                              int *nparams)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);

718
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
719
    ATTRIBUTE_NONNULL(1);
720
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
721 722
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
723

724
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
725 726
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
727

728
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
729

730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
bool qemuDomainIsQ35(const virDomainDef *def);
bool qemuDomainIsI440FX(const virDomainDef *def);
bool qemuDomainHasPCIRoot(const virDomainDef *def);
bool qemuDomainHasPCIeRoot(const virDomainDef *def);
bool qemuDomainNeedsFDC(const virDomainDef *def);
bool qemuDomainIsS390CCW(const virDomainDef *def);
bool qemuDomainIsVirt(const virDomainDef *def);
bool qemuDomainIsPSeries(const virDomainDef *def);
bool qemuDomainHasBuiltinIDE(const virDomainDef *def);

bool qemuDomainMachineIsQ35(const char *machine);
bool qemuDomainMachineIsI440FX(const char *machine);
bool qemuDomainMachineNeedsFDC(const char *machine);
bool qemuDomainMachineIsS390CCW(const char *machine);
bool qemuDomainMachineIsVirt(const char *machine,
                             const virArch arch);
bool qemuDomainMachineIsPSeries(const char *machine,
                                const virArch arch);
bool qemuDomainMachineHasBuiltinIDE(const char *machine);
749

750 751 752
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

753
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
754
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
755

756 757 758 759
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

760
bool qemuDomainSupportsNewVcpuHotplug(virDomainObjPtr vm);
761
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
762
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
763
int qemuDomainValidateVcpuInfo(virDomainObjPtr vm);
764 765
int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
766 767
                              int asyncJob,
                              bool state);
768 769 770 771
bool qemuDomainGetVcpuHalted(virDomainObjPtr vm, unsigned int vcpu);
int qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob);
772

773 774 775 776 777 778 779
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

bool qemuDomainSupportsNetdev(virDomainDefPtr def,
                              virQEMUCapsPtr qemuCaps,
                              virDomainNetDefPtr net);

780 781
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
782
int qemuDomainNetVLAN(virDomainNetDefPtr def);
783

784 785 786
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

787
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
788 789 790

virDomainDiskDefPtr qemuDomainDiskByName(virDomainDefPtr def, const char *name);

J
John Ferlan 已提交
791 792 793 794
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

795 796 797 798
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
799 800 801

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

802 803 804
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

805 806 807
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

808 809 810
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

811 812 813
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

814 815 816 817 818 819
qemuDomainSecretInfoPtr
qemuDomainSecretInfoTLSNew(virConnectPtr conn,
                           qemuDomainObjPrivatePtr priv,
                           const char *srcAlias,
                           const char *secretUUID);

J
John Ferlan 已提交
820 821 822 823
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
824

825 826 827 828
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
829
                                   qemuDomainObjPrivatePtr priv,
830
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
831
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
832

833 834 835 836 837 838 839 840 841 842 843
void qemuDomainSecretChardevDestroy(virDomainChrSourceDefPtr dev)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretChardevPrepare(virConnectPtr conn,
                                   virQEMUDriverConfigPtr cfg,
                                   qemuDomainObjPrivatePtr priv,
                                   const char *chrAlias,
                                   virDomainChrSourceDefPtr dev)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
    ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5);

844 845 846
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

847 848 849 850
int qemuDomainSecretPrepare(virConnectPtr conn,
                            virQEMUDriverPtr driver,
                            virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
851

852 853 854
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

855 856 857 858
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

859 860 861 862 863
void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDefPtr source,
                                       virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

void qemuDomainPrepareChardevSource(virDomainDefPtr def,
864
                                    virQEMUDriverConfigPtr cfg)
865 866
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

867 868 869
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

870 871 872
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

873 874 875
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

876 877 878 879
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

880 881 882
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

883 884 885
int qemuDomainGetHostdevPath(virDomainDefPtr def,
                             virDomainHostdevDefPtr dev,
                             bool teardown,
886 887 888
                             size_t *npaths,
                             char ***path,
                             int **perms);
889

890 891
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
                             virSecurityManagerPtr mgr,
892 893 894 895 896
                             virDomainObjPtr vm);

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

897 898 899
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

900 901
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

902 903
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
904
                                 virStorageSourcePtr src);
905 906 907

int qemuDomainNamespaceTeardownDisk(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
908
                                    virStorageSourcePtr src);
909 910 911 912 913 914 915 916

int qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainHostdevDefPtr hostdev);

int qemuDomainNamespaceTeardownHostdev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainHostdevDefPtr hostdev);
917

M
Michal Privoznik 已提交
918 919 920 921 922 923 924 925
int qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
                                   virDomainMemoryDefPtr memory);

int qemuDomainNamespaceTeardownMemory(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virDomainMemoryDefPtr memory);

926 927 928 929 930 931 932
int qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainChrDefPtr chr);

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
933 934

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
935 936
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
937 938

int qemuDomainNamespaceTeardownRNG(virQEMUDriverPtr driver,
939 940
                                   virDomainObjPtr vm,
                                   virDomainRNGDefPtr rng);
941 942 943 944 945 946

virDomainDiskDefPtr qemuDomainDiskLookupByNodename(virDomainDefPtr def,
                                                   const char *nodename,
                                                   virStorageSourcePtr *src,
                                                   unsigned int *idx);

947 948 949 950
char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk,
                                        virStorageSourcePtr src,
                                        unsigned int idx);

951 952 953
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

954 955 956 957 958
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

959 960 961
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

962
#endif /* __QEMU_DOMAIN_H__ */