qemu_domain.h 35.9 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
# define QEMU_DOMAIN_FORMAT_LIVE_FLAGS      \
43
    (VIR_DOMAIN_XML_SECURE)
44

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

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

59 60 61 62 63
/* 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))

64 65 66
/* Only 1 job is allowed at any time
 * A job includes *all* monitor commands, even those just querying
 * information, not merely actions */
67
typedef enum {
68
    QEMU_JOB_NONE = 0,  /* Always set to 0 for easy if (jobActive) conditions */
69 70 71 72
    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 */
73
    QEMU_JOB_ABORT,         /* Abort current async job */
74
    QEMU_JOB_MIGRATION_OP,  /* Operation influencing outgoing migration */
75

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

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

/* 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.
 */
88
typedef enum {
89 90 91 92 93
    QEMU_ASYNC_JOB_NONE = 0,
    QEMU_ASYNC_JOB_MIGRATION_OUT,
    QEMU_ASYNC_JOB_MIGRATION_IN,
    QEMU_ASYNC_JOB_SAVE,
    QEMU_ASYNC_JOB_DUMP,
94
    QEMU_ASYNC_JOB_SNAPSHOT,
95
    QEMU_ASYNC_JOB_START,
96 97

    QEMU_ASYNC_JOB_LAST
98
} qemuDomainAsyncJob;
99
VIR_ENUM_DECL(qemuDomainAsyncJob)
100

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

112 113 114 115 116 117 118 119

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

J
Jiri Denemark 已提交
120 121 122
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
123
    qemuDomainJobStatus status;
124
    virDomainJobOperation operation;
J
Jiri Denemark 已提交
125
    unsigned long long started; /* When the async job started */
126
    unsigned long long stopped; /* When the domain's CPUs were stopped */
127 128 129 130
    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 已提交
131 132
    /* Computed values */
    unsigned long long timeElapsed;
J
Jiri Denemark 已提交
133
    long long timeDelta; /* delta = received - sent, i.e., the difference
134 135 136 137 138
                            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 已提交
139
    /* Raw values from QEMU */
140
    qemuMonitorMigrationStats stats;
141
    qemuDomainMirrorStats mirrorStats;
J
Jiri Denemark 已提交
142 143
};

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

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

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

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


/* 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;
};

188 189 190 191 192 193 194 195 196 197

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

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

198 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
/* 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;
};

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

240
    struct qemuDomainJobObj job;
241

242 243
    virBitmapPtr namespaces;

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

    qemuAgentPtr agent;
    bool agentError;

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

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

260
    virQEMUCapsPtr qemuCaps;
261
    char *lockState;
262 263

    bool fakeReboot;
264 265

    int jobs_queued;
266 267

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

273
    virChrdevsPtr devs;
274 275 276 277

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

    virCgroupPtr cgroup;
280

281 282
    virPerfPtr perf;

283 284
    qemuDomainUnpluggingDevice unplug;

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

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

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

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

    /* 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;
305 306 307

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

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

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

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

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

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

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
# 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 */
345 346

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

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

J
John Ferlan 已提交
352 353 354 355 356
    /* 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;

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

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

365 366 367 368 369 370

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

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

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

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


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

400 401 402 403 404 405 406 407 408 409
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;
};

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

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

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


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

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

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

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

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

    virCPUDefPtr cpu;
453 454 455 456
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
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);
584

585 586
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

679 680
void qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv);

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

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

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

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

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

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

J
Jiri Denemark 已提交
705 706
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
707 708
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
709 710 711 712 713 714 715 716 717 718
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);

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

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

729
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
730

731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
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);
750

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

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

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

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

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

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

781 782
bool qemuDomainNetSupportsMTU(virDomainNetType type);

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

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

P
Peter Krempa 已提交
788 789
virDomainDiskDefPtr qemuDomainDiskByName(virDomainDefPtr def, const char *name);

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

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

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

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

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

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

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

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

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

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

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

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

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

832 833 834 835 836 837 838 839 840 841 842
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);

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

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

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

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

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

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

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

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

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

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

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

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

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

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

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

899 900
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

958 959 960
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

961
#endif /* __QEMU_DOMAIN_H__ */