qemu_domain.h 33.8 KB
Newer Older
1 2 3
/*
 * qemu_domain.h: QEMU domain private state
 *
4
 * Copyright (C) 2006-2016 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __QEMU_DOMAIN_H__
# define __QEMU_DOMAIN_H__

27
# include "virthread.h"
28
# include "vircgroup.h"
29
# include "virperf.h"
30
# include "domain_addr.h"
31
# include "domain_conf.h"
32
# include "snapshot_conf.h"
33
# include "qemu_monitor.h"
D
Daniel P. Berrange 已提交
34
# include "qemu_agent.h"
35
# include "qemu_conf.h"
36
# include "qemu_capabilities.h"
37
# include "virmdev.h"
38
# include "virchrdev.h"
39
# include "virobject.h"
40
# include "logging/log_manager.h"
41

42 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 106
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
    virDomainJobType type;
    unsigned long long started; /* When the async job started */
107
    unsigned long long stopped; /* When the domain's CPUs were stopped */
108 109 110 111
    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 已提交
112 113 114
    /* Computed values */
    unsigned long long timeElapsed;
    unsigned long long timeRemaining;
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
    struct qemuDomainJobObj job;
220

221 222
    virBitmapPtr namespaces;

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

    qemuAgentPtr agent;
    bool agentError;

232
    bool gotShutdown;
233
    bool beingDestroyed;
234
    char *pidfile;
235

236
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
237
    virDomainUSBAddressSetPtr usbaddrs;
238

239
    virQEMUCapsPtr qemuCaps;
240
    char *lockState;
241 242

    bool fakeReboot;
243 244

    int jobs_queued;
245 246

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

252
    virChrdevsPtr devs;
253 254 255 256

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
257 258

    virCgroupPtr cgroup;
259

260 261
    virPerfPtr perf;

262 263
    qemuDomainUnpluggingDevice unplug;

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

    bool hookRun;  /* true if there was a hook run over this domain */
267 268

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

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

    /* 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;
284 285 286

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

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

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

297 298
# define QEMU_DOMAIN_PRIVATE(vm)	\
    ((qemuDomainObjPrivatePtr) (vm)->privateData)
299

300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
# 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 */
317 318

    bool migrating; /* the disk is being migrated */
319 320 321 322

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

J
John Ferlan 已提交
324 325 326 327 328
    /* 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;

329 330 331
    /* information about the device */
    bool tray; /* device has tray */
    bool removable; /* device media can be removed/changed */
332 333
};

334 335 336
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

337 338 339 340 341 342

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

343
    pid_t tid; /* vcpu thread id */
344
    int enable_id; /* order in which the vcpus were enabled in qemu */
345
    int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
346
    char *alias;
347
    bool halted;
348 349 350 351 352 353 354

    /* information for hotpluggable cpus */
    char *type;
    int socket_id;
    int core_id;
    int thread_id;
    int vcpus;
355 356 357 358 359 360
};

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


361 362 363
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
364
    bool tray;
365
    bool tray_open;
366
    bool empty;
367
    int io_status;
368
    char *nodename;
369 370
};

371 372 373 374 375 376 377 378 379 380
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;
};

381 382
# define QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev)	\
    ((qemuDomainChrSourcePrivatePtr) (dev)->privateData)
383

384 385 386
typedef struct _qemuDomainChrSourcePrivate qemuDomainChrSourcePrivate;
typedef qemuDomainChrSourcePrivate *qemuDomainChrSourcePrivatePtr;
struct _qemuDomainChrSourcePrivate {
387 388 389 390 391 392 393 394
    virObject parent;

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


C
Chen Fan 已提交
395 396
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
397
    QEMU_PROCESS_EVENT_GUESTPANIC,
398
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
399
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
400
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
401
    QEMU_PROCESS_EVENT_BLOCK_JOB,
402
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
403 404 405 406 407

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
408
    virDomainObjPtr vm;
C
Chen Fan 已提交
409
    qemuProcessEventType eventType;
410
    int action;
411
    int status;
412
    void *data;
413 414
};

415 416 417
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

418
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
419
                                            int phase);
420
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
421 422
                                      const char *phase);

423
void qemuDomainEventFlush(int timer, void *opaque);
424

425
void qemuDomainEventQueue(virQEMUDriverPtr driver,
426
                          virObjectEventPtr event);
427 428
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
429

430
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
431
                          virDomainObjPtr obj,
432
                          qemuDomainJob job)
433
    ATTRIBUTE_RETURN_CHECK;
434
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
435
                               virDomainObjPtr obj,
436
                               qemuDomainAsyncJob asyncJob)
437
    ATTRIBUTE_RETURN_CHECK;
438 439 440 441
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
442

443 444 445 446
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
447
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
448
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
449 450
                              virDomainObjPtr obj,
                              int phase);
451 452
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
453 454
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
455
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
456
                                  virDomainObjPtr obj);
457
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
458

459 460
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
461
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
462 463
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
464 465
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
466 467
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
468
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
469
                                   virDomainObjPtr obj,
470
                                   qemuDomainAsyncJob asyncJob)
471
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
472 473


474
qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
475
    ATTRIBUTE_NONNULL(1);
476 477
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
478 479


480 481 482 483
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
484

485 486 487 488
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

489
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
490 491 492 493
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

494
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
495
                             virDomainDefPtr vm,
496
                             unsigned int flags);
497

498
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
499
                          virDomainObjPtr vm,
500
                          unsigned int flags);
501

502
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
503
                              virDomainDefPtr def,
504 505
                              bool inactive,
                              bool compatible);
506

507
void qemuDomainObjTaint(virQEMUDriverPtr driver,
508
                        virDomainObjPtr obj,
509
                        virDomainTaintFlags taint,
510
                        qemuDomainLogContextPtr logCtxt);
511

512
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
513
                             virDomainObjPtr obj,
514
                             qemuDomainLogContextPtr logCtxt);
515
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
516
                                 virDomainObjPtr obj,
517
                                 virDomainDiskDefPtr disk,
518
                                 qemuDomainLogContextPtr logCtxt);
519 520 521
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
522
                                    qemuDomainLogContextPtr logCtxt);
523
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
524
                                virDomainObjPtr obj,
525
                                virDomainNetDefPtr net,
526
                                qemuDomainLogContextPtr logCtxt);
527

528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
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);
void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt);
545

546 547
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

548 549 550 551 552
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

553
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
554 555 556

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
557
                                    virCapsPtr caps,
558 559
                                    char *snapshotDir);

560
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
561 562 563 564 565
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

566
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
567 568 569 570 571
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

572 573 574
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
575
    virQEMUDriverPtr driver;
576 577 578 579 580 581
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

582 583 584
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
585

586
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
587 588
                                         virDomainObjPtr vm);

589
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
590 591
                              virDomainObjPtr vm);

592
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
593 594 595
                             virDomainObjPtr vm,
                             bool value);

596
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
597
                          qemuDomainJob job);
M
Michal Privoznik 已提交
598

599 600
int qemuDomainCheckDiskPresence(virConnectPtr conn,
                                virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
601
                                virDomainObjPtr vm,
602
                                unsigned int flags);
603

604
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
605
                                 virDomainObjPtr vm,
606
                                 virDomainDiskDefPtr disk,
607 608
                                 bool force_probe,
                                 bool report_broken);
609

610
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
611 612
                                 virDomainDiskDefPtr origDisk);

613 614 615
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

616 617 618
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
619
char *qemuDomainStorageAlias(const char *device, int depth);
620

621 622 623 624 625 626 627 628
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

629 630 631 632
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
633
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
634 635
                          virDomainObjPtr vm);

636 637
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
638
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
639

640
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
641
                               virDomainObjPtr vm, int asyncJob);
642

643 644 645 646
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

647 648 649
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
650

651
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
652 653
                              bool reportError);

J
Jiri Denemark 已提交
654 655
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
656 657
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
658 659 660 661 662 663 664 665 666 667
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);

668 669
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
    ATTRIBUTE_NONNULL(1);
670
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
671 672
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
673

674
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
675 676
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
677

678
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
679

680 681
bool qemuDomainMachineIsQ35(const virDomainDef *def);
bool qemuDomainMachineIsI440FX(const virDomainDef *def);
682 683
bool qemuDomainMachineHasPCIRoot(const virDomainDef *def);
bool qemuDomainMachineHasPCIeRoot(const virDomainDef *def);
684
bool qemuDomainMachineNeedsFDC(const virDomainDef *def);
685
bool qemuDomainMachineIsS390CCW(const virDomainDef *def);
J
Ján Tomko 已提交
686
bool qemuDomainMachineIsVirt(const virDomainDef *def);
687
bool qemuDomainMachineIsPSeries(const virDomainDef *def);
688
bool qemuDomainMachineHasBuiltinIDE(const virDomainDef *def);
689

690 691 692
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

693
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
694
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
695

696 697 698 699
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

700
bool qemuDomainSupportsNewVcpuHotplug(virDomainObjPtr vm);
701
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
702
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
703
int qemuDomainValidateVcpuInfo(virDomainObjPtr vm);
704 705
int qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
706 707
                              int asyncJob,
                              bool state);
708 709 710 711
bool qemuDomainGetVcpuHalted(virDomainObjPtr vm, unsigned int vcpu);
int qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
                                virDomainObjPtr vm,
                                int asyncJob);
712

713 714 715 716 717 718 719
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

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

720 721
bool qemuDomainNetSupportsMTU(virDomainNetType type);

J
John Ferlan 已提交
722
int qemuDomainNetVLAN(virDomainNetDefPtr def);
723

724 725 726
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

727
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
728 729 730

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

J
John Ferlan 已提交
731 732 733 734
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

735 736 737 738
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
739 740 741

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

742 743 744
void qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo)
    ATTRIBUTE_NONNULL(1);

745 746 747
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

748 749 750
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

751 752 753
bool qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

754 755 756 757 758 759
qemuDomainSecretInfoPtr
qemuDomainSecretInfoTLSNew(virConnectPtr conn,
                           qemuDomainObjPrivatePtr priv,
                           const char *srcAlias,
                           const char *secretUUID);

J
John Ferlan 已提交
760 761 762 763
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
764

765 766 767 768
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
769
                                   qemuDomainObjPrivatePtr priv,
770
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
771
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
772

773 774 775 776 777 778 779 780 781 782 783
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);

784 785 786
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

787 788 789 790
int qemuDomainSecretPrepare(virConnectPtr conn,
                            virQEMUDriverPtr driver,
                            virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
791

792 793 794
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

795 796 797 798
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

799 800 801 802 803 804 805 806
void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDefPtr source,
                                       virQEMUDriverConfigPtr cfg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

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

807 808 809
int qemuDomainPrepareShmemChardev(virDomainShmemDefPtr shmem)
    ATTRIBUTE_NONNULL(1);

810 811 812
bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

813 814 815
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
    ATTRIBUTE_NONNULL(1);

816 817 818 819
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
                           virDomainObjPtr vm,
                           qemuDomainAsyncJob asyncJob);

820 821 822
bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
                                virQEMUCapsPtr qemuCaps);

823 824 825
int qemuDomainGetHostdevPath(virDomainDefPtr def,
                             virDomainHostdevDefPtr dev,
                             bool teardown,
826 827 828
                             size_t *npaths,
                             char ***path,
                             int **perms);
829

830 831
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
                             virSecurityManagerPtr mgr,
832 833 834 835 836
                             virDomainObjPtr vm);

int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

837 838 839
void qemuDomainDestroyNamespace(virQEMUDriverPtr driver,
                                virDomainObjPtr vm);

840 841
bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);

842 843
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm,
844
                                 virStorageSourcePtr src);
845 846 847

int qemuDomainNamespaceTeardownDisk(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
848
                                    virStorageSourcePtr src);
849 850 851 852 853 854 855 856

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

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

M
Michal Privoznik 已提交
858 859 860 861 862 863 864 865
int qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
                                   virDomainMemoryDefPtr memory);

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

866 867 868 869 870 871 872
int qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainChrDefPtr chr);

int qemuDomainNamespaceTeardownChardev(virQEMUDriverPtr driver,
                                       virDomainObjPtr vm,
                                       virDomainChrDefPtr chr);
873 874

int qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
875 876
                                virDomainObjPtr vm,
                                virDomainRNGDefPtr rng);
877 878

int qemuDomainNamespaceTeardownRNG(virQEMUDriverPtr driver,
879 880
                                   virDomainObjPtr vm,
                                   virDomainRNGDefPtr rng);
881 882 883 884 885 886

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

887 888 889 890
char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk,
                                        virStorageSourcePtr src,
                                        unsigned int idx);

891 892 893
virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr,
                                                       virDomainDefPtr def);

894
#endif /* __QEMU_DOMAIN_H__ */