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

J
Jiri Denemark 已提交
102 103 104 105
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
    virDomainJobType type;
106
    virDomainJobOperation operation;
J
Jiri Denemark 已提交
107
    unsigned long long started; /* When the async job started */
108
    unsigned long long stopped; /* When the domain's CPUs were stopped */
109 110 111 112
    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 已提交
113 114
    /* Computed values */
    unsigned long long timeElapsed;
J
Jiri Denemark 已提交
115
    long long timeDelta; /* delta = received - sent, i.e., the difference
116 117 118 119 120
                            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 已提交
121
    /* Raw values from QEMU */
122
    qemuMonitorMigrationStats stats;
J
Jiri Denemark 已提交
123 124
};

125
struct qemuDomainJobObj {
126
    virCond cond;                       /* Use to coordinate jobs */
127
    qemuDomainJob active;               /* Currently running job */
128
    unsigned long long owner;           /* Thread id which set current job */
129
    const char *ownerAPI;               /* The API which owns the job */
J
Jiri Denemark 已提交
130
    unsigned long long started;         /* When the current job started */
131

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

149
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
150 151
                                          virDomainObjPtr vm);

J
John Ferlan 已提交
152
# define QEMU_DOMAIN_MASTER_KEY_LEN 32  /* 32 bytes for 256 bit random key */
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168


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

169 170 171 172 173 174 175 176 177 178

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

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

179 180 181 182 183 184 185 186 187 188 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
/* 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;
};

216 217 218
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
219 220
    virQEMUDriverPtr driver;

221
    struct qemuDomainJobObj job;
222

223 224
    virBitmapPtr namespaces;

225
    qemuMonitorPtr mon;
226
    virDomainChrSourceDefPtr monConfig;
E
Eric Blake 已提交
227
    bool monJSON;
228 229
    bool monError;
    unsigned long long monStart;
D
Daniel P. Berrange 已提交
230 231 232 233

    qemuAgentPtr agent;
    bool agentError;

234
    bool gotShutdown;
235
    bool beingDestroyed;
236
    char *pidfile;
237

238
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
239
    virDomainUSBAddressSetPtr usbaddrs;
240

241
    virQEMUCapsPtr qemuCaps;
242
    char *lockState;
243 244

    bool fakeReboot;
245 246

    int jobs_queued;
247 248

    unsigned long migMaxBandwidth;
J
Jiri Denemark 已提交
249
    char *origname;
250
    int nbdPort; /* Port used for migration with NBD */
251
    unsigned short migrationPort;
252
    int preMigrationState;
253

254
    virChrdevsPtr devs;
255 256 257 258

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
259 260

    virCgroupPtr cgroup;
261

262 263
    virPerfPtr perf;

264 265
    qemuDomainUnpluggingDevice unplug;

266
    char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
267 268

    bool hookRun;  /* true if there was a hook run over this domain */
269 270

    /* Bitmaps below hold data from the auto NUMA feature */
271
    virBitmapPtr autoNodeset;
272
    virBitmapPtr autoCpuset;
273 274 275

    bool signalIOError; /* true if the domain condition should be signalled on
                           I/O error */
276 277
    bool signalStop; /* true if the domain condition should be signalled on
                        QMP STOP event */
278
    char *machineName;
279 280
    char *libDir;            /* base path for per-domain files */
    char *channelTargetDir;  /* base path for per-domain channel targets */
J
John Ferlan 已提交
281 282 283 284 285

    /* 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;
286 287 288

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

290 291 292
    /* for migrations using TLS with a secret (not to be saved in our */
    /* private XML). */
    qemuDomainSecretInfoPtr migSecinfo;
293

294 295 296
    /* Used when fetching/storing the current 'tls-creds' migration setting */
    /* (not to be saved in our private XML). */
    char *migTLSAlias;
297 298 299 300

    /* CPU def used to start the domain when it differs from the one actually
     * provided by QEMU. */
    virCPUDefPtr origCPU;
301 302 303

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

306 307
# define QEMU_DOMAIN_PRIVATE(vm)	\
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
308

309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
# 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 */
326 327

    bool migrating; /* the disk is being migrated */
328 329 330 331

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

J
John Ferlan 已提交
333 334 335 336 337
    /* 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;

338 339 340
    /* information about the device */
    bool tray; /* device has tray */
    bool removable; /* device media can be removed/changed */
341 342
};

343 344 345
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

346 347 348 349 350 351

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

352
    pid_t tid; /* vcpu thread id */
353
    int enable_id; /* order in which the vcpus were enabled in qemu */
354
    int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
355
    char *alias;
356
    bool halted;
357 358 359 360 361 362

    /* information for hotpluggable cpus */
    char *type;
    int socket_id;
    int core_id;
    int thread_id;
363
    int node_id;
364
    int vcpus;
365 366 367 368 369 370
};

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


371 372 373
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
374
    bool tray;
375
    bool tray_open;
376
    bool empty;
377
    int io_status;
378
    char *nodename;
379 380
};

381 382 383 384 385 386 387 388 389 390
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;
};

391 392
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)	\
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
393

394 395 396
typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate;
typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr;
struct _qemuDomainChrSourcePrivate {
397 398 399 400 401 402 403 404
    virObject parent;

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


C
Chen Fan 已提交
405 406
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
407
    QEMU_PROCESS_EVENT_GUESTPANIC,
408
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
409
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
410
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
411
    QEMU_PROCESS_EVENT_BLOCK_JOB,
412
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
413 414 415 416 417

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
418
    virDomainObjPtr vm;
C
Chen Fan 已提交
419
    qemuProcessEventType eventType;
420
    int action;
421
    int status;
422
    void *data;
423 424
};

425 426 427
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

428 429 430 431
typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
struct _qemuDomainSaveCookie {
    virObject parent;
432 433

    virCPUDefPtr cpu;
434 435 436 437
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

438
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
439
                                            int phase);
440
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
441 442
                                      const char *phase);

443
void qemuDomainEventFlush(int timer, void *opaque);
444

445
void qemuDomainEventQueue(virQEMUDriverPtr driver,
446
                          virObjectEventPtr event);
447 448
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
449

450
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
451
                          virDomainObjPtr obj,
452
                          qemuDomainJob job)
453
    ATTRIBUTE_RETURN_CHECK;
454
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
455
                               virDomainObjPtr obj,
456 457
                               qemuDomainAsyncJob asyncJob,
                               virDomainJobOperation operation)
458
    ATTRIBUTE_RETURN_CHECK;
459 460 461 462
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
463

464 465 466 467
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
468
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
469
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
470 471
                              virDomainObjPtr obj,
                              int phase);
472 473
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
474 475
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
476
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
477
                                  virDomainObjPtr obj);
478
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
479

480 481
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
482
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
483 484
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
485 486
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
487 488
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
489
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
490
                                   virDomainObjPtr obj,
491
                                   qemuDomainAsyncJob asyncJob)
492
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
493 494


495
qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
496
    ATTRIBUTE_NONNULL(1);
497 498
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
499 500


501 502 503 504
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
505

506 507 508 509
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

510
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
511 512 513 514
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

515
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
516
                             virDomainDefPtr vm,
517
                             unsigned int flags);
518

519
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
520
                          virDomainObjPtr vm,
521
                          unsigned int flags);
522

523
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
524
                              virDomainDefPtr def,
525
                              virCPUDefPtr origCPU,
526 527
                              bool inactive,
                              bool compatible);
528

529
void qemuDomainObjTaint(virQEMUDriverPtr driver,
530
                        virDomainObjPtr obj,
531
                        virDomainTaintFlags taint,
532
                        qemuDomainLogContextPtr logCtxt);
533

534
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
535
                             virDomainObjPtr obj,
536
                             qemuDomainLogContextPtr logCtxt);
537
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
538
                                 virDomainObjPtr obj,
539
                                 virDomainDiskDefPtr disk,
540
                                 qemuDomainLogContextPtr logCtxt);
541 542 543
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
544
                                    qemuDomainLogContextPtr logCtxt);
545
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
546
                                virDomainObjPtr obj,
547
                                virDomainNetDefPtr net,
548
                                qemuDomainLogContextPtr logCtxt);
549

550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
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);
565

566 567
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

568 569 570 571 572
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

573
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
574 575 576

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
577
                                    virCapsPtr caps,
578
                                    virDomainXMLOptionPtr xmlopt,
579 580
                                    char *snapshotDir);

581
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
582 583 584 585 586
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

587
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
588 589 590 591 592
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

593 594 595
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
596
    virQEMUDriverPtr driver;
597 598 599 600 601 602
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

603 604 605
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
606

607
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
608 609
                                         virDomainObjPtr vm);

610
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
611 612
                              virDomainObjPtr vm);

613 614 615
void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

616
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
617 618 619
                             virDomainObjPtr vm,
                             bool value);

620
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
621
                          qemuDomainJob job);
M
Michal Privoznik 已提交
622

623 624
int qemuDomainCheckDiskPresence(virConnectPtr conn,
                                virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
625
                                virDomainObjPtr vm,
626
                                unsigned int flags);
627

628
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
629
                                 virDomainObjPtr vm,
630
                                 virDomainDiskDefPtr disk,
631 632
                                 bool force_probe,
                                 bool report_broken);
633

634
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
635 636
                                 virDomainDiskDefPtr origDisk);

637 638 639
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

640 641 642
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
643
char *qemuDomainStorageAlias(const char *device, int depth);
644

645 646 647 648 649 650 651 652
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

653 654 655 656
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
657
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
658 659
                          virDomainObjPtr vm);

660 661
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
662
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
663
extern virDomainABIStability virQEMUDriverDomainABIStability;
664
extern virSaveCookieCallbacks virQEMUDriverDomainSaveCookie;
665

666
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
667
                               virDomainObjPtr vm, int asyncJob);
668

669 670 671 672
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

673 674 675
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
676

677 678 679 680
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

681
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
682 683
                              bool reportError);

J
Jiri Denemark 已提交
684 685
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
686 687
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
688 689 690 691 692 693 694 695 696 697
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);

698 699
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
    ATTRIBUTE_NONNULL(1);
700
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
701 702
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
703

704
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
705 706
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
707

708
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
709

710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
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);
729

730 731 732
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

733
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
734
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
735

736 737 738 739
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

740
bool qemuDomainSupportsNewVcpuHotplug(virDomainObjPtr vm);
741
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
742
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
743
int qemuDomainValidateVcpuInfo(virDomainObjPtr vm);
744 745
int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
746 747
                              int asyncJob,
                              bool state);
748 749 750 751
bool qemuDomainGetVcpuHalted(virDomainObjPtr vm, unsigned int vcpu);
int qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob);
752

753 754 755 756 757 758 759
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

760 761
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
762
int qemuDomainNetVLAN(virDomainNetDefPtr def);
763

764 765 766
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

767
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
768 769 770

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

J
John Ferlan 已提交
771 772 773 774
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

775 776 777 778
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
779 780 781

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

782 783 784
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

785 786 787
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

788 789 790
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

791 792 793
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

794 795 796 797 798 799
qemuDomainSecretInfoPtr
qemuDomainSecretInfoTLSNew(virConnectPtr conn,
                           qemuDomainObjPrivatePtr priv,
                           const char *srcAlias,
                           const char *secretUUID);

J
John Ferlan 已提交
800 801 802 803
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
804

805 806 807 808
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
809
                                   qemuDomainObjPrivatePtr priv,
810
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
811
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
812

813 814 815 816 817 818 819 820 821 822 823
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);

824 825 826
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

827 828 829 830
int qemuDomainSecretPrepare(virConnectPtr conn,
                            virQEMUDriverPtr driver,
                            virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
831

832 833 834
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

835 836 837 838
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

839 840 841 842 843 844 845 846
void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDefPtr source,
                                       virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

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

847 848 849
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

850 851 852
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

853 854 855
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

856 857 858 859
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

860 861 862
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

863 864 865
int qemuDomainGetHostdevPath(virDomainDefPtr def,
                             virDomainHostdevDefPtr dev,
                             bool teardown,
866 867 868
                             size_t *npaths,
                             char ***path,
                             int **perms);
869

870 871
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
                             virSecurityManagerPtr mgr,
872 873 874 875 876
                             virDomainObjPtr vm);

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

877 878 879
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

880 881
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

882 883
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
884
                                 virStorageSourcePtr src);
885 886 887

int qemuDomainNamespaceTeardownDisk(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
888
                                    virStorageSourcePtr src);
889 890 891 892 893 894 895 896

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

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

M
Michal Privoznik 已提交
898 899 900 901 902 903 904 905
int qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
                                   virDomainMemoryDefPtr memory);

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

906 907 908 909 910 911 912
int qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainChrDefPtr chr);

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
913 914

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
915 916
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
917 918

int qemuDomainNamespaceTeardownRNG(virQEMUDriverPtr driver,
919 920
                                   virDomainObjPtr vm,
                                   virDomainRNGDefPtr rng);
921 922 923 924 925 926

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

927 928 929 930
char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk,
                                        virStorageSourcePtr src,
                                        unsigned int idx);

931 932 933
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

934 935 936 937 938
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

939 940 941
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

942
#endif /* __QEMU_DOMAIN_H__ */