qemu_domain.h 35.3 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 115
    /* Computed values */
    unsigned long long timeElapsed;
    unsigned long long timeRemaining;
J
Jiri Denemark 已提交
116
    long long timeDelta; /* delta = received - sent, i.e., the difference
117 118 119 120 121
                            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 已提交
122
    /* Raw values from QEMU */
123
    qemuMonitorMigrationStats stats;
J
Jiri Denemark 已提交
124 125
};

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

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

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

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


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

170 171 172 173 174 175 176 177 178 179

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

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

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

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

222
    struct qemuDomainJobObj job;
223

224 225
    virBitmapPtr namespaces;

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

    qemuAgentPtr agent;
    bool agentError;

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

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

242
    virQEMUCapsPtr qemuCaps;
243
    char *lockState;
244 245

    bool fakeReboot;
246 247

    int jobs_queued;
248 249

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

255
    virChrdevsPtr devs;
256 257 258 259

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

    virCgroupPtr cgroup;
262

263 264
    virPerfPtr perf;

265 266
    qemuDomainUnpluggingDevice unplug;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

347 348 349 350 351 352

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

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

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

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


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

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

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

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

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


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

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

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

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

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

    virCPUDefPtr cpu;
435 436 437 438
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

567 568
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

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

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

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

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

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

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

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

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

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

614
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
615 616 617
                             virDomainObjPtr vm,
                             bool value);

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

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

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

632
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
633 634
                                 virDomainDiskDefPtr origDisk);

635 636 637
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

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

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

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

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

664
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
665
                               virDomainObjPtr vm, int asyncJob);
666

667 668 669 670
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

671 672 673
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
674

675 676 677 678
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

679
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
680 681
                              bool reportError);

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

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

702
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
703 704
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
705

706
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
707

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

728 729 730
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

731
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
732
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
733

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

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

751 752 753 754 755 756 757
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

758 759
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
760
int qemuDomainNetVLAN(virDomainNetDefPtr def);
761

762 763 764
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

765
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
766 767 768

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

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

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

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

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
777 778 779

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

780 781 782
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

783 784 785
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

786 787 788
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

789 790 791
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

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

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

803 804 805 806
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

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

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

822 823 824
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

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

830 831 832
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

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

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

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

845 846 847
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

848 849 850
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

851 852 853
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

854 855 856 857
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

858 859 860
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

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

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

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

875 876 877
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

878 879
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

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

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

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

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

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

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

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

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
911 912

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
913 914
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
915 916

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

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

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

929 930 931
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

932 933 934 935 936
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

937
#endif /* __QEMU_DOMAIN_H__ */