qemu_domain.h 18.3 KB
Newer Older
1 2 3
/*
 * qemu_domain.h: QEMU domain private state
 *
4
 * Copyright (C) 2006-2014 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 "domain_addr.h"
30
# include "domain_conf.h"
31
# include "snapshot_conf.h"
32
# include "qemu_monitor.h"
D
Daniel P. Berrange 已提交
33
# include "qemu_agent.h"
34
# include "qemu_conf.h"
35
# include "qemu_capabilities.h"
36
# include "virchrdev.h"
37
# include "virobject.h"
38

39 40 41 42
# define QEMU_DOMAIN_FORMAT_LIVE_FLAGS      \
    (VIR_DOMAIN_XML_SECURE |                \
     VIR_DOMAIN_XML_UPDATE_CPU)

43 44 45
# if ULONG_MAX == 4294967295
/* Qemu has a 64-bit limit, but we are limited by our historical choice of
 * representing bandwidth in a long instead of a 64-bit int.  */
46
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX ULONG_MAX
47
# else
48
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX (INT64_MAX / (1024 * 1024))
49
# endif
50

51
# define JOB_MASK(job)                  (1 << (job - 1))
52
# define QEMU_JOB_DEFAULT_MASK          \
53 54 55
    (JOB_MASK(QEMU_JOB_QUERY) |         \
     JOB_MASK(QEMU_JOB_DESTROY) |       \
     JOB_MASK(QEMU_JOB_ABORT))
56

57 58 59 60 61
/* 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))

62 63 64
/* Only 1 job is allowed at any time
 * A job includes *all* monitor commands, even those just querying
 * information, not merely actions */
65
typedef enum {
66
    QEMU_JOB_NONE = 0,  /* Always set to 0 for easy if (jobActive) conditions */
67 68 69 70
    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 */
71
    QEMU_JOB_ABORT,         /* Abort current async job */
72
    QEMU_JOB_MIGRATION_OP,  /* Operation influencing outgoing migration */
73

74
    /* The following two items must always be the last items before JOB_LAST */
75 76
    QEMU_JOB_ASYNC,         /* Asynchronous job */
    QEMU_JOB_ASYNC_NESTED,  /* Normal job within an async job */
77 78

    QEMU_JOB_LAST
79
} qemuDomainJob;
80
VIR_ENUM_DECL(qemuDomainJob)
81 82 83 84 85

/* 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.
 */
86
typedef enum {
87 88 89 90 91
    QEMU_ASYNC_JOB_NONE = 0,
    QEMU_ASYNC_JOB_MIGRATION_OUT,
    QEMU_ASYNC_JOB_MIGRATION_IN,
    QEMU_ASYNC_JOB_SAVE,
    QEMU_ASYNC_JOB_DUMP,
92
    QEMU_ASYNC_JOB_SNAPSHOT,
93 94

    QEMU_ASYNC_JOB_LAST
95
} qemuDomainAsyncJob;
96
VIR_ENUM_DECL(qemuDomainAsyncJob)
97

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

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

128
    virCond asyncCond;                  /* Use to coordinate with async jobs */
129
    qemuDomainAsyncJob asyncJob;        /* Currently active async job */
130
    unsigned long long asyncOwner;      /* Thread which set current async job */
131
    const char *asyncOwnerAPI;          /* The API which owns the async job */
J
Jiri Denemark 已提交
132
    unsigned long long asyncStarted;    /* When the current async job started */
J
Jiri Denemark 已提交
133
    int phase;                          /* Job phase (mainly for migrations) */
134
    unsigned long long mask;            /* Jobs allowed during async job */
135
    bool dump_memory_only;              /* use dump-guest-memory to do dump */
J
Jiri Denemark 已提交
136
    qemuDomainJobInfoPtr current;       /* async job progress data */
137
    qemuDomainJobInfoPtr completed;     /* statistics data of a recently completed job */
138
    bool abortJob;                      /* abort of the job requested */
139
    bool spiceMigrated;                 /* spice migration completed */
140 141
};

142
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
143 144
                                          virDomainObjPtr vm);

145 146 147
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
148
    struct qemuDomainJobObj job;
149 150

    qemuMonitorPtr mon;
151
    virDomainChrSourceDefPtr monConfig;
E
Eric Blake 已提交
152
    bool monJSON;
153 154
    bool monError;
    unsigned long long monStart;
D
Daniel P. Berrange 已提交
155 156 157 158 159

    qemuAgentPtr agent;
    bool agentError;
    unsigned long long agentStart;

160
    bool gotShutdown;
161
    bool beingDestroyed;
162
    char *pidfile;
163 164 165 166

    int nvcpupids;
    int *vcpupids;

167
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
168
    virDomainCCWAddressSetPtr ccwaddrs;
169
    virDomainVirtioSerialAddrSetPtr vioserialaddrs;
170
    int persistentAddrs;
171

172
    virQEMUCapsPtr qemuCaps;
173
    char *lockState;
174 175

    bool fakeReboot;
176 177

    int jobs_queued;
178 179

    unsigned long migMaxBandwidth;
J
Jiri Denemark 已提交
180
    char *origname;
181
    int nbdPort; /* Port used for migration with NBD */
182
    unsigned short migrationPort;
183
    int preMigrationState;
184

185
    virChrdevsPtr devs;
186 187 188 189

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
190 191

    virCgroupPtr cgroup;
192 193 194

    virCond unplugFinished; /* signals that unpluggingDevice was unplugged */
    const char *unpluggingDevice; /* alias of the device that is being unplugged */
195
    char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
196 197

    bool hookRun;  /* true if there was a hook run over this domain */
198 199

    /* Bitmaps below hold data from the auto NUMA feature */
200
    virBitmapPtr autoNodeset;
201
    virBitmapPtr autoCpuset;
202 203 204

    bool signalIOError; /* true if the domain condition should be signalled on
                           I/O error */
205 206
};

207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
# 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 */
224 225

    bool migrating; /* the disk is being migrated */
226 227
};

C
Chen Fan 已提交
228 229
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
230
    QEMU_PROCESS_EVENT_GUESTPANIC,
231
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
232
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
233
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
234
    QEMU_PROCESS_EVENT_BLOCK_JOB,
C
Chen Fan 已提交
235 236 237 238 239

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
240
    virDomainObjPtr vm;
C
Chen Fan 已提交
241
    qemuProcessEventType eventType;
242
    int action;
243
    int status;
244
    void *data;
245 246
};

247
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
248
                                            int phase);
249
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
250 251
                                      const char *phase);

252
void qemuDomainEventFlush(int timer, void *opaque);
253

254
void qemuDomainEventQueue(virQEMUDriverPtr driver,
255
                          virObjectEventPtr event);
256

257
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
258
                          virDomainObjPtr obj,
259
                          qemuDomainJob job)
260
    ATTRIBUTE_RETURN_CHECK;
261
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
262
                               virDomainObjPtr obj,
263
                               qemuDomainAsyncJob asyncJob)
264 265
    ATTRIBUTE_RETURN_CHECK;

266 267 268 269
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
270
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
271
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
272 273
                              virDomainObjPtr obj,
                              int phase);
274 275
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
276 277
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
278
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
279
                                  virDomainObjPtr obj);
280
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
281

282 283
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
284
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
285 286
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
287 288
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
289 290
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
291
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
292
                                   virDomainObjPtr obj,
293
                                   qemuDomainAsyncJob asyncJob)
294
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
295 296


297 298 299 300
void qemuDomainObjEnterAgent(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitAgent(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
D
Daniel P. Berrange 已提交
301 302


303 304 305 306
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
307

308 309 310 311
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

312
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
313 314 315 316
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

317
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
318
                             virDomainDefPtr vm,
319
                             unsigned int flags);
320

321
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
322
                          virDomainObjPtr vm,
323
                          unsigned int flags);
324

325
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
326
                              virDomainDefPtr def,
327 328
                              bool inactive,
                              bool compatible);
329

330
void qemuDomainObjTaint(virQEMUDriverPtr driver,
331
                        virDomainObjPtr obj,
332
                        virDomainTaintFlags taint,
333
                        int logFD);
334

335
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
336 337
                             virDomainObjPtr obj,
                             int logFD);
338
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
339
                                 virDomainObjPtr obj,
340 341
                                 virDomainDiskDefPtr disk,
                                 int logFD);
342 343 344 345
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
                                    int logFD);
346
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
347
                                virDomainObjPtr obj,
348 349
                                virDomainNetDefPtr net,
                                int logFD);
350

351

352 353 354
int qemuDomainCreateLog(virQEMUDriverPtr driver, virDomainObjPtr vm, bool append);
int qemuDomainOpenLog(virQEMUDriverPtr driver, virDomainObjPtr vm, off_t pos);
int qemuDomainAppendLog(virQEMUDriverPtr driver,
355 356 357
                        virDomainObjPtr vm,
                        int logFD,
                        const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(4, 5);
358

359
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
360 361 362 363 364

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
                                    char *snapshotDir);

365
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
366 367 368 369 370
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

371
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
372 373 374 375 376
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

377 378 379
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
380
    virQEMUDriverPtr driver;
381 382 383 384 385 386 387 388 389 390
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

void qemuDomainSnapshotDiscardAll(void *payload,
                                  const void *name,
                                  void *data);

391
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
392 393
                                         virDomainObjPtr vm);

394
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
395 396
                              virDomainObjPtr vm);

397
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
398 399 400
                             virDomainObjPtr vm,
                             bool value);

401
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
402
                          qemuDomainJob job);
M
Michal Privoznik 已提交
403

404
int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
405 406
                                virDomainObjPtr vm,
                                bool start_with_state);
407

408
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
409
                                 virDomainObjPtr vm,
410
                                 virDomainDiskDefPtr disk,
411 412
                                 bool force_probe,
                                 bool report_broken);
413

414 415 416 417
bool qemuDomainDiskSourceDiffers(virConnectPtr conn,
                                 virDomainDiskDefPtr disk,
                                 virDomainDiskDefPtr origDisk);

418 419 420
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
421
char *qemuDomainStorageAlias(const char *device, int depth);
422

423 424 425 426
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
427
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
428 429
                          virDomainObjPtr vm);

430 431
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
432
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
433

434
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
435
                               virDomainObjPtr vm, int asyncJob);
436

437 438 439 440
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

441 442 443
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
444

445
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
446 447
                              bool reportError);

J
Jiri Denemark 已提交
448 449
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
450 451
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
452 453 454 455 456 457 458 459 460 461
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);

462 463
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
    ATTRIBUTE_NONNULL(1);
464
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
465 466
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
467

468
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
469
void qemuDomainMemoryDeviceAlignSize(virDomainMemoryDefPtr mem);
470

471 472
virDomainChrSourceDefPtr qemuFindAgentConfig(virDomainDefPtr def);

473 474
bool qemuDomainMachineIsQ35(const virDomainDef *def);
bool qemuDomainMachineIsI440FX(const virDomainDef *def);
475
bool qemuDomainMachineNeedsFDC(const virDomainDef *def);
476
bool qemuDomainMachineIsS390CCW(const virDomainDef *def);
477

478 479 480
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

481
#endif /* __QEMU_DOMAIN_H__ */