qemu_domain.h 37.8 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

C
caoxinhua 已提交
53
# define JOB_MASK(job)                  (job == 0 ? 0 : 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
    virTristateBool allowReboot;
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

    /* Tracks blockjob state for vm. Valid only while reconnecting to qemu. */
    virTristateBool reconnectBlockjobs;
327 328 329 330

    /* Migration capabilities. Rechecked on reconnect, not to be saved in
     * private XML. */
    virBitmapPtr migrationCaps;
331 332
};

333
# define QEMU_DOMAIN_PRIVATE(vm)        \
334
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
335

336
# define QEMU_DOMAIN_DISK_PRIVATE(disk) \
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
    ((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 */
353 354

    bool migrating; /* the disk is being migrated */
355

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

361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
# define QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src) \
    ((qemuDomainStorageSourcePrivatePtr) (src)->privateData)

typedef struct _qemuDomainStorageSourcePrivate qemuDomainStorageSourcePrivate;
typedef qemuDomainStorageSourcePrivate *qemuDomainStorageSourcePrivatePtr;
struct _qemuDomainStorageSourcePrivate {
    virObject parent;

    /* data required for authentication to the storage source */
    qemuDomainSecretInfoPtr secinfo;

    /* data required for decryption of encrypted storage source */
    qemuDomainSecretInfoPtr encinfo;
};

virObjectPtr qemuDomainStorageSourcePrivateNew(void);

378
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)   \
379 380
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

381 382 383 384 385 386

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

387
    pid_t tid; /* vcpu thread id */
388
    int enable_id; /* order in which the vcpus were enabled in qemu */
389
    int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
390
    char *alias;
391
    bool halted;
392 393 394 395 396 397

    /* information for hotpluggable cpus */
    char *type;
    int socket_id;
    int core_id;
    int thread_id;
398
    int node_id;
399
    int vcpus;
400 401 402 403 404 405
};

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


406 407 408
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
409
    bool tray;
410
    bool tray_open;
411
    bool empty;
412
    int io_status;
413
    char *nodename;
414 415
};

416 417 418 419 420 421 422 423 424 425
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;
};

426
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)    \
427
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
428

429 430 431
typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate;
typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr;
struct _qemuDomainChrSourcePrivate {
432 433 434 435 436 437 438 439
    virObject parent;

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


C
Chen Fan 已提交
440 441
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
442
    QEMU_PROCESS_EVENT_GUESTPANIC,
443
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
444
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
445
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
446
    QEMU_PROCESS_EVENT_BLOCK_JOB,
447
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
448 449 450 451 452

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
453
    virDomainObjPtr vm;
C
Chen Fan 已提交
454
    qemuProcessEventType eventType;
455
    int action;
456
    int status;
457
    void *data;
458 459
};

460 461 462
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

463 464 465 466
typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
struct _qemuDomainSaveCookie {
    virObject parent;
467 468

    virCPUDefPtr cpu;
469 470 471 472
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

473
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
474
                                            int phase);
475
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
476 477
                                      const char *phase);

478
void qemuDomainEventFlush(int timer, void *opaque);
479

480
void qemuDomainEventQueue(virQEMUDriverPtr driver,
481
                          virObjectEventPtr event);
482 483
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
484

485
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
486
                          virDomainObjPtr obj,
487
                          qemuDomainJob job)
488
    ATTRIBUTE_RETURN_CHECK;
489
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
490
                               virDomainObjPtr obj,
491 492
                               qemuDomainAsyncJob asyncJob,
                               virDomainJobOperation operation)
493
    ATTRIBUTE_RETURN_CHECK;
494 495 496 497
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
498

499 500 501 502
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
503
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
504
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
505 506
                              virDomainObjPtr obj,
                              int phase);
507 508
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
509 510
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
511
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
512
                                  virDomainObjPtr obj);
513
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
514

515 516
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
517
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
518 519
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
520 521
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
522 523
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
524
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
525
                                   virDomainObjPtr obj,
526
                                   qemuDomainAsyncJob asyncJob)
527
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
528 529


530
qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
531
    ATTRIBUTE_NONNULL(1);
532 533
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
534 535


536 537 538 539
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
540

541 542 543 544
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

545
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
546 547 548 549
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

550
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
551
                             virDomainDefPtr vm,
552
                             unsigned int flags);
553

554
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
555
                          virDomainObjPtr vm,
556
                          unsigned int flags);
557

558
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
559
                              virDomainDefPtr def,
560
                              virCPUDefPtr origCPU,
561 562
                              bool inactive,
                              bool compatible);
563

564
void qemuDomainObjTaint(virQEMUDriverPtr driver,
565
                        virDomainObjPtr obj,
566
                        virDomainTaintFlags taint,
567
                        qemuDomainLogContextPtr logCtxt);
568

569
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
570
                             virDomainObjPtr obj,
571
                             qemuDomainLogContextPtr logCtxt);
572
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
573
                                 virDomainObjPtr obj,
574
                                 virDomainDiskDefPtr disk,
575
                                 qemuDomainLogContextPtr logCtxt);
576 577 578
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
579
                                    qemuDomainLogContextPtr logCtxt);
580
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
581
                                virDomainObjPtr obj,
582
                                virDomainNetDefPtr net,
583
                                qemuDomainLogContextPtr logCtxt);
584

585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
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);
600

601 602
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

603 604 605 606 607
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

608
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
609 610 611

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
612
                                    virCapsPtr caps,
613
                                    virDomainXMLOptionPtr xmlopt,
614 615
                                    char *snapshotDir);

616
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
617 618 619 620 621
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

622
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
623 624 625 626 627
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

628 629 630
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
631
    virQEMUDriverPtr driver;
632 633 634 635 636 637
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

638 639 640
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
641

642
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
643 644
                                         virDomainObjPtr vm);

645
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
646 647
                              virDomainObjPtr vm);

648 649 650
void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

651
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
652 653 654
                             virDomainObjPtr vm,
                             bool value);

655
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
656
                          qemuDomainJob job);
M
Michal Privoznik 已提交
657

658 659 660 661 662
int qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     size_t diskIndex,
                                     bool cold_boot);

663
int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
664
                                virDomainObjPtr vm,
665
                                unsigned int flags);
666

667
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
668
                                 virDomainObjPtr vm,
669
                                 virDomainDiskDefPtr disk,
670 671
                                 bool force_probe,
                                 bool report_broken);
672

673
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
674 675
                                 virDomainDiskDefPtr origDisk);

676 677 678
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

679 680 681
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
682
char *qemuDomainStorageAlias(const char *device, int depth);
683

684 685 686 687 688 689 690 691
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

692 693 694 695
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
696
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
697 698
                          virDomainObjPtr vm);

699 700
void qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv);

701 702
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
703
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
704
extern virDomainABIStability virQEMUDriverDomainABIStability;
705
extern virSaveCookieCallbacks virQEMUDriverDomainSaveCookie;
706

707
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
708
                               virDomainObjPtr vm, int asyncJob);
709

710 711 712 713
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

714 715 716
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
717

718 719 720 721
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

722
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
723 724
                              bool reportError);

J
Jiri Denemark 已提交
725 726
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
727 728
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
729 730 731 732 733 734 735 736 737 738
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);

739
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
740
    ATTRIBUTE_NONNULL(1);
741
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
742 743
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
744

745
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
746 747
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
748

749
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
750

751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
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);
770

771 772 773
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

774
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
775
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
776

777 778 779 780
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

781
bool qemuDomainSupportsNewVcpuHotplug(virDomainObjPtr vm);
782
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
783
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
784
int qemuDomainValidateVcpuInfo(virDomainObjPtr vm);
785 786
int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
787 788
                              int asyncJob,
                              bool state);
789 790 791 792
bool qemuDomainGetVcpuHalted(virDomainObjPtr vm, unsigned int vcpu);
int qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob);
793

794 795 796 797 798 799 800
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

801 802
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
803
int qemuDomainNetVLAN(virDomainNetDefPtr def);
804

805 806 807
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

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

J
John Ferlan 已提交
810 811 812 813
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

814 815 816 817
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
818 819 820

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

821 822 823
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

824 825 826
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

827 828 829
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

830 831 832
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

833 834 835 836 837 838
qemuDomainSecretInfoPtr
qemuDomainSecretInfoTLSNew(virConnectPtr conn,
                           qemuDomainObjPrivatePtr priv,
                           const char *srcAlias,
                           const char *secretUUID);

J
John Ferlan 已提交
839 840 841 842
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
843

844 845 846 847
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
848
                                   qemuDomainObjPrivatePtr priv,
849
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
850
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
851

852 853 854 855 856 857 858 859 860 861 862
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);

863 864 865
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

866 867 868 869
int qemuDomainSecretPrepare(virConnectPtr conn,
                            virQEMUDriverPtr driver,
                            virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
870

871 872 873
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

874 875 876 877
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

878 879 880 881 882
void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDefPtr source,
                                       virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

void qemuDomainPrepareChardevSource(virDomainDefPtr def,
883
                                    virQEMUDriverConfigPtr cfg)
884 885
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

886 887 888 889 890 891
int
qemuDomainPrepareDiskSourceTLS(virStorageSourcePtr src,
                               const char *diskAlias,
                               virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);

892 893 894
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

895 896 897
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

898 899 900
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

L
Lin Ma 已提交
901 902 903
int qemuDomainDefValidateDisk(const virDomainDiskDef *disk,
                              virQEMUCapsPtr qemuCaps);

904 905 906 907
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

908 909 910
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

911 912 913
int qemuDomainGetHostdevPath(virDomainDefPtr def,
                             virDomainHostdevDefPtr dev,
                             bool teardown,
914 915 916
                             size_t *npaths,
                             char ***path,
                             int **perms);
917

918 919
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
                             virSecurityManagerPtr mgr,
920 921 922 923 924
                             virDomainObjPtr vm);

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

925 926 927
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

928 929
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

930 931
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
932
                                 virStorageSourcePtr src);
933 934 935

int qemuDomainNamespaceTeardownDisk(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
936
                                    virStorageSourcePtr src);
937 938 939 940 941 942 943 944

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

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

M
Michal Privoznik 已提交
946 947 948 949 950 951 952 953
int qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
                                   virDomainMemoryDefPtr memory);

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

954 955 956 957 958 959 960
int qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainChrDefPtr chr);

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
961 962

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
963 964
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
965 966

int qemuDomainNamespaceTeardownRNG(virQEMUDriverPtr driver,
967 968
                                   virDomainObjPtr vm,
                                   virDomainRNGDefPtr rng);
969 970 971 972 973 974

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

975 976 977 978
char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk,
                                        virStorageSourcePtr src,
                                        unsigned int idx);

979 980 981
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

982 983 984 985 986
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

987 988 989 990
int
qemuDomainFixupCPUs(virDomainObjPtr vm,
                    virCPUDefPtr *origCPU);

991 992 993
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

994 995 996 997 998 999 1000 1001
void
qemuDomainObjPrivateXMLFormatAllowReboot(virBufferPtr buf,
                                         virTristateBool allowReboot);

int
qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
                                        virTristateBool *allowReboot);

1002 1003 1004 1005 1006
bool qemuDomainCheckCCWS390AddressSupport(const virDomainDef *def,
                                    virDomainDeviceInfo info,
                                    virQEMUCapsPtr qemuCaps,
                                    const char *devicename);

1007 1008 1009 1010 1011
int
qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     qemuDomainAsyncJob asyncJob);

1012
#endif /* __QEMU_DOMAIN_H__ */