[libvirt] [PATCH v2] qemuProcessStart: Switch to flags instead of bunch booleans
Daniel P. Berrange
berrange at redhat.com
Mon Apr 16 15:26:35 UTC 2012
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 :|
More information about the libvir-list
mailing list