On Mon, Apr 16, 2012 at 05:09:59PM +0200, Michal Privoznik wrote:
Currently, we have 3 boolean arguments we have to pass
to qemuProcessStart(). As libvirt grows it is harder and harder
to remember them and their position. Therefore we should
switch to flags instead.
---
diff to v1:
-fix a test for START_PAUSED flag
src/qemu/qemu_driver.c | 45 +++++++++++++++++++++++++++++----------------
src/qemu/qemu_migration.c | 7 ++++---
src/qemu/qemu_process.c | 21 +++++++++++++--------
src/qemu/qemu_process.h | 12 ++++++++----
4 files changed, 54 insertions(+), 31 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 65ed290..436ef37 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1351,10 +1351,16 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const
char *xml,
virDomainPtr dom = NULL;
virDomainEventPtr event = NULL;
virDomainEventPtr event2 = NULL;
+ unsigned int start_flags = VIR_QEMU_PROCESS_START_COLD;
virCheckFlags(VIR_DOMAIN_START_PAUSED |
VIR_DOMAIN_START_AUTODESTROY, NULL);
+ if (flags & VIR_DOMAIN_START_PAUSED)
+ start_flags |= VIR_QEMU_PROCESS_START_PAUSED;
+ if (flags & VIR_DOMAIN_START_AUTODESTROY)
+ start_flags |= VIR_QEMU_PROCESS_START_AUTODESROY;
+
qemuDriverLock(driver);
if (!(def = virDomainDefParseString(driver->caps, xml,
QEMU_EXPECTED_VIRT_TYPES,
@@ -1383,10 +1389,9 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const
char *xml,
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup; /* XXXX free the 'vm' we created ? */
- if (qemuProcessStart(conn, driver, vm, NULL, true,
- (flags & VIR_DOMAIN_START_PAUSED) != 0,
- (flags & VIR_DOMAIN_START_AUTODESTROY) != 0,
- -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE) < 0) {
+ if (qemuProcessStart(conn, driver, vm, NULL, -1, NULL, NULL,
+ VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
+ start_flags) < 0) {
virDomainAuditStart(vm, "booted", false);
if (qemuDomainObjEndJob(driver, vm) > 0)
qemuDomainRemoveInactive(driver, vm);
@@ -4138,9 +4143,9 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
}
/* Set the migration source and start it up. */
- ret = qemuProcessStart(conn, driver, vm, "stdio", false, true,
- false, *fd, path, NULL,
- VIR_NETDEV_VPORT_PROFILE_OP_RESTORE);
+ ret = qemuProcessStart(conn, driver, vm, "stdio", *fd, path, NULL,
+ VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
+ VIR_QEMU_PROCESS_START_PAUSED);
if (intermediatefd != -1) {
if (ret < 0) {
@@ -4710,6 +4715,10 @@ qemuDomainObjStart(virConnectPtr conn,
bool autodestroy = (flags & VIR_DOMAIN_START_AUTODESTROY) != 0;
bool bypass_cache = (flags & VIR_DOMAIN_START_BYPASS_CACHE) != 0;
bool force_boot = (flags & VIR_DOMAIN_START_FORCE_BOOT) != 0;
+ unsigned int start_flags = VIR_QEMU_PROCESS_START_COLD;
+
+ start_flags |= start_paused ? VIR_QEMU_PROCESS_START_PAUSED : 0;
+ start_flags |= autodestroy ? VIR_QEMU_PROCESS_START_AUTODESROY : 0;
/*
* If there is a managed saved state restore it instead of starting
@@ -4741,9 +4750,8 @@ qemuDomainObjStart(virConnectPtr conn,
}
}
- ret = qemuProcessStart(conn, driver, vm, NULL, true, start_paused,
- autodestroy, -1, NULL, NULL,
- VIR_NETDEV_VPORT_PROFILE_OP_CREATE);
+ ret = qemuProcessStart(conn, driver, vm, NULL, -1, NULL, NULL,
+ VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags);
virDomainAuditStart(vm, "booted", ret >= 0);
if (ret >= 0) {
virDomainEventPtr event =
@@ -11027,9 +11035,10 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr
snapshot,
if (config)
virDomainObjAssignDef(vm, config, false);
- rc = qemuProcessStart(snapshot->domain->conn, driver, vm, NULL,
- false, true, false, -1, NULL, snap,
- VIR_NETDEV_VPORT_PROFILE_OP_CREATE);
+ rc = qemuProcessStart(snapshot->domain->conn,
+ driver, vm, NULL, -1, NULL, snap,
+ VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
+ VIR_QEMU_PROCESS_START_PAUSED);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
event = virDomainEventNewFromObj(vm,
@@ -11114,12 +11123,16 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr
snapshot,
VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
/* Flush first event, now do transition 2 or 3 */
bool paused = (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED) != 0;
+ unsigned int start_flags = 0;
+
+ start_flags |= paused ? VIR_QEMU_PROCESS_START_PAUSED : 0;
if (event)
qemuDomainEventQueue(driver, event);
- rc = qemuProcessStart(snapshot->domain->conn, driver, vm, NULL,
- false, paused, false, -1, NULL, NULL,
- VIR_NETDEV_VPORT_PROFILE_OP_CREATE);
+ rc = qemuProcessStart(snapshot->domain->conn,
+ driver, vm, NULL, -1, NULL, NULL,
+ VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
+ start_flags);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
if (rc < 0) {
if (!vm->persistent) {
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index dc4d616..fc83805 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1303,9 +1303,10 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
/* Start the QEMU daemon, with the same command-line arguments plus
* -incoming $migrateFrom
*/
- if (qemuProcessStart(dconn, driver, vm, migrateFrom, false, true,
- true, dataFD[0], NULL, NULL,
- VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START) < 0) {
+ if (qemuProcessStart(dconn, driver, vm, migrateFrom, dataFD[0], NULL, NULL,
+ VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START,
+ VIR_QEMU_PROCESS_START_PAUSED |
+ VIR_QEMU_PROCESS_START_AUTODESROY) < 0) {
virDomainAuditStart(vm, "migrated", false);
/* Note that we don't set an error here because qemuProcessStart
* should have already done that.
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 692fc32..ecbf039 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3271,13 +3271,11 @@ int qemuProcessStart(virConnectPtr conn,
struct qemud_driver *driver,
virDomainObjPtr vm,
const char *migrateFrom,
- bool cold_boot,
- bool start_paused,
- bool autodestroy,
int stdin_fd,
const char *stdin_path,
virDomainSnapshotObjPtr snapshot,
- enum virNetDevVPortProfileOp vmop)
+ enum virNetDevVPortProfileOp vmop,
+ unsigned int flags)
{
int ret;
off_t pos = -1;
@@ -3290,6 +3288,12 @@ int qemuProcessStart(virConnectPtr conn,
unsigned long cur_balloon;
int i;
+ /* Okay, these are just internal flags,
+ * but doesn't hurt to check */
+ virCheckFlags(VIR_QEMU_PROCESS_START_COLD |
+ VIR_QEMU_PROCESS_START_PAUSED |
+ VIR_QEMU_PROCESS_START_AUTODESROY, -1);
+
hookData.conn = conn;
hookData.vm = vm;
hookData.driver = driver;
@@ -3434,7 +3438,8 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup;
VIR_DEBUG("Checking for CDROM and floppy presence");
- if (qemuDomainCheckDiskPresence(driver, vm, cold_boot) < 0)
+ if (qemuDomainCheckDiskPresence(driver, vm,
+ flags & VIR_QEMU_PROCESS_START_COLD) < 0)
goto cleanup;
VIR_DEBUG("Setting up domain cgroup (if required)");
@@ -3633,7 +3638,7 @@ int qemuProcessStart(virConnectPtr conn,
VIR_DEBUG("Handshake complete, child running");
if (migrateFrom)
- start_paused = true;
+ flags |= VIR_QEMU_PROCESS_START_PAUSED;
if (ret == -1) /* The VM failed to start; tear filters before taps */
virDomainConfVMNWFilterTeardown(vm);
@@ -3708,7 +3713,7 @@ int qemuProcessStart(virConnectPtr conn,
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
- if (!start_paused) {
+ if (!(flags & VIR_QEMU_PROCESS_START_PAUSED)) {
VIR_DEBUG("Starting domain CPUs");
/* Allow the CPUS to start executing */
if (qemuProcessStartCPUs(driver, vm, conn,
@@ -3726,7 +3731,7 @@ int qemuProcessStart(virConnectPtr conn,
VIR_DOMAIN_PAUSED_USER);
}
- if (autodestroy &&
+ if (flags & VIR_QEMU_PROCESS_START_AUTODESROY &&
qemuProcessAutoDestroyAdd(driver, vm, conn) < 0)
goto cleanup;
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 5cb5ffc..2d75b005 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -44,17 +44,21 @@ void qemuProcessReconnectAll(virConnectPtr conn, struct qemud_driver
*driver);
int qemuProcessAssignPCIAddresses(virDomainDefPtr def);
+typedef enum {
+ VIR_QEMU_PROCESS_START_COLD = 1 << 0,
+ VIR_QEMU_PROCESS_START_PAUSED = 1 << 1,
+ VIR_QEMU_PROCESS_START_AUTODESROY = 1 << 2,
+} qemuProcessStartFlags;
+
int qemuProcessStart(virConnectPtr conn,
struct qemud_driver *driver,
virDomainObjPtr vm,
const char *migrateFrom,
- bool cold_boot,
- bool start_paused,
- bool autodestroy,
int stdin_fd,
const char *stdin_path,
virDomainSnapshotObjPtr snapshot,
- enum virNetDevVPortProfileOp vmop);
+ enum virNetDevVPortProfileOp vmop,
+ unsigned int flags);
void qemuProcessStop(struct qemud_driver *driver,
virDomainObjPtr vm,
ACK, that's better now
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|