qemu_domain.h 35.7 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_POSTCOPY,
107 108 109 110 111
    QEMU_DOMAIN_JOB_STATUS_COMPLETED,
    QEMU_DOMAIN_JOB_STATUS_FAILED,
    QEMU_DOMAIN_JOB_STATUS_CANCELED,
} qemuDomainJobStatus;

J
Jiri Denemark 已提交
112 113 114
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
115
    qemuDomainJobStatus status;
116
    virDomainJobOperation operation;
J
Jiri Denemark 已提交
117
    unsigned long long started; /* When the async job started */
118
    unsigned long long stopped; /* When the domain's CPUs were stopped */
119 120 121 122
    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 已提交
123 124
    /* Computed values */
    unsigned long long timeElapsed;
J
Jiri Denemark 已提交
125
    long long timeDelta; /* delta = received - sent, i.e., the difference
126 127 128 129 130
                            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 已提交
131
    /* Raw values from QEMU */
132
    qemuMonitorMigrationStats stats;
J
Jiri Denemark 已提交
133 134
};

135
struct qemuDomainJobObj {
136
    virCond cond;                       /* Use to coordinate jobs */
137
    qemuDomainJob active;               /* Currently running job */
138
    unsigned long long owner;           /* Thread id which set current job */
139
    const char *ownerAPI;               /* The API which owns the job */
J
Jiri Denemark 已提交
140
    unsigned long long started;         /* When the current job started */
141

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

159
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
160 161
                                          virDomainObjPtr vm);

J
John Ferlan 已提交
162
# define QEMU_DOMAIN_MASTER_KEY_LEN 32  /* 32 bytes for 256 bit random key */
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178


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

179 180 181 182 183 184 185 186 187 188

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

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

189 190 191 192 193 194 195 196 197 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
/* 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;
};

226 227 228
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
229 230
    virQEMUDriverPtr driver;

231
    struct qemuDomainJobObj job;
232

233 234
    virBitmapPtr namespaces;

235
    qemuMonitorPtr mon;
236
    virDomainChrSourceDefPtr monConfig;
E
Eric Blake 已提交
237
    bool monJSON;
238 239
    bool monError;
    unsigned long long monStart;
D
Daniel P. Berrange 已提交
240 241 242 243

    qemuAgentPtr agent;
    bool agentError;

244
    bool gotShutdown;
245
    bool beingDestroyed;
246
    char *pidfile;
247

248
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
249
    virDomainUSBAddressSetPtr usbaddrs;
250

251
    virQEMUCapsPtr qemuCaps;
252
    char *lockState;
253 254

    bool fakeReboot;
255 256

    int jobs_queued;
257 258

    unsigned long migMaxBandwidth;
J
Jiri Denemark 已提交
259
    char *origname;
260
    int nbdPort; /* Port used for migration with NBD */
261
    unsigned short migrationPort;
262
    int preMigrationState;
263

264
    virChrdevsPtr devs;
265 266 267 268

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
269 270

    virCgroupPtr cgroup;
271

272 273
    virPerfPtr perf;

274 275
    qemuDomainUnpluggingDevice unplug;

276
    char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
277 278

    bool hookRun;  /* true if there was a hook run over this domain */
279 280

    /* Bitmaps below hold data from the auto NUMA feature */
281
    virBitmapPtr autoNodeset;
282
    virBitmapPtr autoCpuset;
283 284 285

    bool signalIOError; /* true if the domain condition should be signalled on
                           I/O error */
286 287
    bool signalStop; /* true if the domain condition should be signalled on
                        QMP STOP event */
288
    char *machineName;
289 290
    char *libDir;            /* base path for per-domain files */
    char *channelTargetDir;  /* base path for per-domain channel targets */
J
John Ferlan 已提交
291 292 293 294 295

    /* 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;
296 297 298

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

300 301 302
    /* for migrations using TLS with a secret (not to be saved in our */
    /* private XML). */
    qemuDomainSecretInfoPtr migSecinfo;
303

304 305 306
    /* Used when fetching/storing the current 'tls-creds' migration setting */
    /* (not to be saved in our private XML). */
    char *migTLSAlias;
307 308 309 310

    /* CPU def used to start the domain when it differs from the one actually
     * provided by QEMU. */
    virCPUDefPtr origCPU;
311 312 313

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

316 317
# define QEMU_DOMAIN_PRIVATE(vm)	\
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
318

319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
# 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 */
336 337

    bool migrating; /* the disk is being migrated */
338 339 340 341

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

J
John Ferlan 已提交
343 344 345 346 347
    /* 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;

348 349 350
    /* information about the device */
    bool tray; /* device has tray */
    bool removable; /* device media can be removed/changed */
351 352
};

353 354 355
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

356 357 358 359 360 361

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

362
    pid_t tid; /* vcpu thread id */
363
    int enable_id; /* order in which the vcpus were enabled in qemu */
364
    int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
365
    char *alias;
366
    bool halted;
367 368 369 370 371 372

    /* information for hotpluggable cpus */
    char *type;
    int socket_id;
    int core_id;
    int thread_id;
373
    int node_id;
374
    int vcpus;
375 376 377 378 379 380
};

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


381 382 383
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
384
    bool tray;
385
    bool tray_open;
386
    bool empty;
387
    int io_status;
388
    char *nodename;
389 390
};

391 392 393 394 395 396 397 398 399 400
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;
};

401 402
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)	\
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
403

404 405 406
typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate;
typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr;
struct _qemuDomainChrSourcePrivate {
407 408 409 410 411 412 413 414
    virObject parent;

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


C
Chen Fan 已提交
415 416
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
417
    QEMU_PROCESS_EVENT_GUESTPANIC,
418
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
419
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
420
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
421
    QEMU_PROCESS_EVENT_BLOCK_JOB,
422
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
423 424 425 426 427

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
428
    virDomainObjPtr vm;
C
Chen Fan 已提交
429
    qemuProcessEventType eventType;
430
    int action;
431
    int status;
432
    void *data;
433 434
};

435 436 437
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

438 439 440 441
typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
struct _qemuDomainSaveCookie {
    virObject parent;
442 443

    virCPUDefPtr cpu;
444 445 446 447
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

448
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
449
                                            int phase);
450
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
451 452
                                      const char *phase);

453
void qemuDomainEventFlush(int timer, void *opaque);
454

455
void qemuDomainEventQueue(virQEMUDriverPtr driver,
456
                          virObjectEventPtr event);
457 458
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
459

460
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
461
                          virDomainObjPtr obj,
462
                          qemuDomainJob job)
463
    ATTRIBUTE_RETURN_CHECK;
464
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
465
                               virDomainObjPtr obj,
466 467
                               qemuDomainAsyncJob asyncJob,
                               virDomainJobOperation operation)
468
    ATTRIBUTE_RETURN_CHECK;
469 470 471 472
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
473

474 475 476 477
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
478
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
479
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
480 481
                              virDomainObjPtr obj,
                              int phase);
482 483
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
484 485
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
486
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
487
                                  virDomainObjPtr obj);
488
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
489

490 491
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
492
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
493 494
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
495 496
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
497 498
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
499
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
500
                                   virDomainObjPtr obj,
501
                                   qemuDomainAsyncJob asyncJob)
502
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
503 504


505
qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
506
    ATTRIBUTE_NONNULL(1);
507 508
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
509 510


511 512 513 514
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
515

516 517 518 519
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

520
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
521 522 523 524
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

525
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
526
                             virDomainDefPtr vm,
527
                             unsigned int flags);
528

529
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
530
                          virDomainObjPtr vm,
531
                          unsigned int flags);
532

533
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
534
                              virDomainDefPtr def,
535
                              virCPUDefPtr origCPU,
536 537
                              bool inactive,
                              bool compatible);
538

539
void qemuDomainObjTaint(virQEMUDriverPtr driver,
540
                        virDomainObjPtr obj,
541
                        virDomainTaintFlags taint,
542
                        qemuDomainLogContextPtr logCtxt);
543

544
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
545
                             virDomainObjPtr obj,
546
                             qemuDomainLogContextPtr logCtxt);
547
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
548
                                 virDomainObjPtr obj,
549
                                 virDomainDiskDefPtr disk,
550
                                 qemuDomainLogContextPtr logCtxt);
551 552 553
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
554
                                    qemuDomainLogContextPtr logCtxt);
555
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
556
                                virDomainObjPtr obj,
557
                                virDomainNetDefPtr net,
558
                                qemuDomainLogContextPtr logCtxt);
559

560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
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);
575

576 577
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

578 579 580 581 582
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

583
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
584 585 586

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
587
                                    virCapsPtr caps,
588
                                    virDomainXMLOptionPtr xmlopt,
589 590
                                    char *snapshotDir);

591
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
592 593 594 595 596
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

597
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
598 599 600 601 602
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

603 604 605
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
606
    virQEMUDriverPtr driver;
607 608 609 610 611 612
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

613 614 615
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
616

617
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
618 619
                                         virDomainObjPtr vm);

620
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
621 622
                              virDomainObjPtr vm);

623 624 625
void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

626
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
627 628 629
                             virDomainObjPtr vm,
                             bool value);

630
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
631
                          qemuDomainJob job);
M
Michal Privoznik 已提交
632

633 634
int qemuDomainCheckDiskPresence(virConnectPtr conn,
                                virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
635
                                virDomainObjPtr vm,
636
                                unsigned int flags);
637

638
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
639
                                 virDomainObjPtr vm,
640
                                 virDomainDiskDefPtr disk,
641 642
                                 bool force_probe,
                                 bool report_broken);
643

644
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
645 646
                                 virDomainDiskDefPtr origDisk);

647 648 649
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

650 651 652
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
653
char *qemuDomainStorageAlias(const char *device, int depth);
654

655 656 657 658 659 660 661 662
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

663 664 665 666
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
667
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
668 669
                          virDomainObjPtr vm);

670 671
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
672
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
673
extern virDomainABIStability virQEMUDriverDomainABIStability;
674
extern virSaveCookieCallbacks virQEMUDriverDomainSaveCookie;
675

676
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
677
                               virDomainObjPtr vm, int asyncJob);
678

679 680 681 682
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

683 684 685
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
686

687 688 689 690
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

691
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
692 693
                              bool reportError);

J
Jiri Denemark 已提交
694 695
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
696 697
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
698 699 700 701 702 703 704 705 706 707
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);

708 709
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
    ATTRIBUTE_NONNULL(1);
710
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
711 712
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
713

714
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
715 716
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
717

718
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
719

720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
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);
739

740 741 742
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

743
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
744
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
745

746 747 748 749
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

750
bool qemuDomainSupportsNewVcpuHotplug(virDomainObjPtr vm);
751
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
752
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
753
int qemuDomainValidateVcpuInfo(virDomainObjPtr vm);
754 755
int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
756 757
                              int asyncJob,
                              bool state);
758 759 760 761
bool qemuDomainGetVcpuHalted(virDomainObjPtr vm, unsigned int vcpu);
int qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob);
762

763 764 765 766 767 768 769
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

770 771
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
772
int qemuDomainNetVLAN(virDomainNetDefPtr def);
773

774 775 776
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

777
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
778 779 780

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

J
John Ferlan 已提交
781 782 783 784
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

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

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
789 790 791

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

792 793 794
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

795 796 797
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

798 799 800
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

801 802 803
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

804 805 806 807 808 809
qemuDomainSecretInfoPtr
qemuDomainSecretInfoTLSNew(virConnectPtr conn,
                           qemuDomainObjPrivatePtr priv,
                           const char *srcAlias,
                           const char *secretUUID);

J
John Ferlan 已提交
810 811 812 813
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
814

815 816 817 818
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
819
                                   qemuDomainObjPrivatePtr priv,
820
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
821
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
822

823 824 825 826 827 828 829 830 831 832 833
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);

834 835 836
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

837 838 839 840
int qemuDomainSecretPrepare(virConnectPtr conn,
                            virQEMUDriverPtr driver,
                            virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
841

842 843 844
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

845 846 847 848
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

849 850 851 852 853 854 855 856
void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDefPtr source,
                                       virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

void qemuDomainPrepareChardevSource(virDomainDefPtr def,
                                    virQEMUDriverPtr driver)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

857 858 859
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

860 861 862
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

863 864 865
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

866 867 868 869
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

870 871 872
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

873 874 875
int qemuDomainGetHostdevPath(virDomainDefPtr def,
                             virDomainHostdevDefPtr dev,
                             bool teardown,
876 877 878
                             size_t *npaths,
                             char ***path,
                             int **perms);
879

880 881
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
                             virSecurityManagerPtr mgr,
882 883 884 885 886
                             virDomainObjPtr vm);

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

887 888 889
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

890 891
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

892 893
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
894
                                 virStorageSourcePtr src);
895 896 897

int qemuDomainNamespaceTeardownDisk(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
898
                                    virStorageSourcePtr src);
899 900 901 902 903 904 905 906

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

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

M
Michal Privoznik 已提交
908 909 910 911 912 913 914 915
int qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
                                   virDomainMemoryDefPtr memory);

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

916 917 918 919 920 921 922
int qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainChrDefPtr chr);

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
923 924

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
925 926
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
927 928

int qemuDomainNamespaceTeardownRNG(virQEMUDriverPtr driver,
929 930
                                   virDomainObjPtr vm,
                                   virDomainRNGDefPtr rng);
931 932 933 934 935 936

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

937 938 939 940
char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk,
                                        virStorageSourcePtr src,
                                        unsigned int idx);

941 942 943
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

944 945 946 947 948
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

949 950 951
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

952
#endif /* __QEMU_DOMAIN_H__ */