qemu_domain.h 35.6 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 105 106 107 108 109
typedef enum {
    QEMU_DOMAIN_JOB_STATUS_NONE = 0,
    QEMU_DOMAIN_JOB_STATUS_ACTIVE,
    QEMU_DOMAIN_JOB_STATUS_COMPLETED,
    QEMU_DOMAIN_JOB_STATUS_FAILED,
    QEMU_DOMAIN_JOB_STATUS_CANCELED,
} qemuDomainJobStatus;

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

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

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

157
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
158 159
                                          virDomainObjPtr vm);

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


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

177 178 179 180 181 182 183 184 185 186

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

bool qemuDomainNamespaceEnabled(virDomainObjPtr vm,
                                qemuDomainNamespace ns);

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 217 218 219 220 221 222 223
/* 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;
};

224 225 226
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
227 228
    virQEMUDriverPtr driver;

229
    struct qemuDomainJobObj job;
230

231 232
    virBitmapPtr namespaces;

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

    qemuAgentPtr agent;
    bool agentError;

242
    bool gotShutdown;
243
    bool beingDestroyed;
244
    char *pidfile;
245

246
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
247
    virDomainUSBAddressSetPtr usbaddrs;
248

249
    virQEMUCapsPtr qemuCaps;
250
    char *lockState;
251 252

    bool fakeReboot;
253 254

    int jobs_queued;
255 256

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

262
    virChrdevsPtr devs;
263 264 265 266

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
267 268

    virCgroupPtr cgroup;
269

270 271
    virPerfPtr perf;

272 273
    qemuDomainUnpluggingDevice unplug;

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

    bool hookRun;  /* true if there was a hook run over this domain */
277 278

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

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

    /* 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;
294 295 296

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

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

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

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

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

314 315
# define QEMU_DOMAIN_PRIVATE(vm)	\
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
316

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

    bool migrating; /* the disk is being migrated */
336 337 338 339

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

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

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

351 352 353
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

354 355 356 357 358 359

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

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

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

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


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

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

399 400
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)	\
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
401

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

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


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

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

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

433 434 435
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

436 437 438 439
typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie;
typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr;
struct _qemuDomainSaveCookie {
    virObject parent;
440 441

    virCPUDefPtr cpu;
442 443 444 445
};

qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm);

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

451
void qemuDomainEventFlush(int timer, void *opaque);
452

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

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

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

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


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


509 510 511 512
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
513

514 515 516 517
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

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

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

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

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

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

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

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

574 575
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

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

581
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
582 583 584

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

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

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

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

611 612 613
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
614

615
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
616 617
                                         virDomainObjPtr vm);

618
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
619 620
                              virDomainObjPtr vm);

621 622 623
void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

624
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
625 626 627
                             virDomainObjPtr vm,
                             bool value);

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

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

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

642
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
643 644
                                 virDomainDiskDefPtr origDisk);

645 646 647
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

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

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

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

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

674
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
675
                               virDomainObjPtr vm, int asyncJob);
676

677 678 679 680
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

681 682 683
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
684

685 686 687 688
bool qemuDomainCheckABIStability(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
                                 virDomainDefPtr dst);

689
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
690 691
                              bool reportError);

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

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

712
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
713 714
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
715

716
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
717

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

738 739 740
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

741
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
742
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
743

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

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

761 762 763 764 765 766 767
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

768 769
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
770
int qemuDomainNetVLAN(virDomainNetDefPtr def);
771

772 773 774
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

775
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
776 777 778

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

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

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

783 784 785 786
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
787 788 789

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

790 791 792
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

793 794 795
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

796 797 798
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

799 800 801
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

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

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

813 814 815 816
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

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

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

832 833 834
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

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

840 841 842
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

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

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

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

855 856 857
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

858 859 860
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

861 862 863
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

864 865 866 867
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

868 869 870
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

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

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

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

885 886 887
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

888 889
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

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

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

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

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

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

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

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

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
921 922

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
923 924
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
925 926

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

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

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

939 940 941
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

942 943 944 945 946
int
qemuDomainUpdateCPU(virDomainObjPtr vm,
                    virCPUDefPtr cpu,
                    virCPUDefPtr *origCPU);

947 948 949
char *
qemuDomainGetMachineName(virDomainObjPtr vm);

950
#endif /* __QEMU_DOMAIN_H__ */