There's a few places in startup code paths which pass around a
virConnectPtr which is no longer required. Specifically, the
qemuProcessStart() method now only requires a non-NULL connection if
autodestroy is requested.
Reviewed-by: John Ferlan <jferlan(a)redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_driver.c | 39 +++++++--------------------------------
src/qemu/qemu_process.c | 26 ++++++++------------------
src/qemu/qemu_process.h | 2 +-
3 files changed, 16 insertions(+), 51 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0a72102779..95c5043436 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -181,12 +181,6 @@ static virNWFilterCallbackDriver qemuCallbackDriver = {
};
-struct qemuAutostartData {
- virQEMUDriverPtr driver;
- virConnectPtr conn;
-};
-
-
/**
* qemuDomObjFromDomain:
* @domain: Domain pointer that has to be looked up
@@ -254,9 +248,9 @@ static int
qemuAutostartDomain(virDomainObjPtr vm,
void *opaque)
{
- struct qemuAutostartData *data = opaque;
+ virQEMUDriverPtr driver = opaque;
int flags = 0;
- virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(data->driver);
+ virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int ret = -1;
if (cfg->autoStartBypassCache)
@@ -267,7 +261,7 @@ qemuAutostartDomain(virDomainObjPtr vm,
virResetLastError();
if (vm->autostart &&
!virDomainObjIsActive(vm)) {
- if (qemuProcessBeginJob(data->driver, vm,
+ if (qemuProcessBeginJob(driver, vm,
VIR_DOMAIN_JOB_OPERATION_START) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to start job on VM '%s': %s"),
@@ -275,14 +269,14 @@ qemuAutostartDomain(virDomainObjPtr vm,
goto cleanup;
}
- if (qemuDomainObjStart(data->conn, data->driver, vm, flags,
+ if (qemuDomainObjStart(NULL, driver, vm, flags,
QEMU_ASYNC_JOB_START) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to autostart VM '%s': %s"),
vm->def->name, virGetLastErrorMessage());
}
- qemuProcessEndJob(data->driver, vm);
+ qemuProcessEndJob(driver, vm);
}
ret = 0;
@@ -296,20 +290,7 @@ qemuAutostartDomain(virDomainObjPtr vm,
static void
qemuAutostartDomains(virQEMUDriverPtr driver)
{
- virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
- /* XXX: Figure out a better way todo this. The domain
- * startup code needs a connection handle in order
- * to lookup the bridge associated with a virtual
- * network
- */
- virConnectPtr conn = virConnectOpen(cfg->uri);
- /* Ignoring NULL conn which is mostly harmless here */
- struct qemuAutostartData data = { driver, conn };
-
- virDomainObjListForEach(driver->domains, qemuAutostartDomain, &data);
-
- virObjectUnref(conn);
- virObjectUnref(cfg);
+ virDomainObjListForEach(driver->domains, qemuAutostartDomain, driver);
}
@@ -623,7 +604,6 @@ qemuStateInitialize(bool privileged,
void *opaque)
{
char *driverConf = NULL;
- virConnectPtr conn = NULL;
virQEMUDriverConfigPtr cfg;
uid_t run_uid = -1;
gid_t run_gid = -1;
@@ -933,8 +913,6 @@ qemuStateInitialize(bool privileged,
qemuDomainNetsRestart,
NULL);
- conn = virConnectOpen(cfg->uri);
-
/* Then inactive persistent configs */
if (virDomainObjListLoadAllConfigs(qemu_driver->domains,
cfg->configDir,
@@ -952,19 +930,16 @@ qemuStateInitialize(bool privileged,
qemuDomainManagedSaveLoad,
qemu_driver);
- qemuProcessReconnectAll(conn, qemu_driver);
+ qemuProcessReconnectAll(qemu_driver);
qemu_driver->workerPool = virThreadPoolNew(0, 1, 0, qemuProcessEventHandler,
qemu_driver);
if (!qemu_driver->workerPool)
goto error;
- virObjectUnref(conn);
-
virNWFilterRegisterCallbackDriver(&qemuCallbackDriver);
return 0;
error:
- virObjectUnref(conn);
VIR_FREE(driverConf);
VIR_FREE(hugepagePath);
VIR_FREE(memoryBackingPath);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 703d62d3e9..d0bab5d84e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2749,7 +2749,6 @@ qemuProcessUpdateVideoRamSize(virQEMUDriverPtr driver,
struct qemuProcessHookData {
- virConnectPtr conn;
virDomainObjPtr vm;
virQEMUDriverPtr driver;
virQEMUDriverConfigPtr cfg;
@@ -5937,7 +5936,12 @@ qemuProcessLaunch(virConnectPtr conn,
cfg = virQEMUDriverGetConfig(driver);
- hookData.conn = conn;
+ if ((flags & VIR_QEMU_PROCESS_START_AUTODESTROY) && !conn) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Domain autodestroy requires a connection handle"));
+ return -1;
+ }
+
hookData.vm = vm;
hookData.driver = driver;
/* We don't increase cfg's reference counter here. */
@@ -7246,7 +7250,6 @@ qemuProcessRefreshCPU(virQEMUDriverPtr driver,
struct qemuProcessReconnectData {
- virConnectPtr conn;
virQEMUDriverPtr driver;
virDomainObjPtr obj;
};
@@ -7254,10 +7257,6 @@ struct qemuProcessReconnectData {
* Open an existing VM's monitor, re-detect VCPU threads
* and re-reserve the security labels in use
*
- * We own the virConnectPtr we are passed here - whoever started
- * this thread function has increased the reference counter to it
- * so that we now have to close it.
- *
* This function also inherits a locked and ref'd domain object.
*
* This function needs to:
@@ -7279,7 +7278,6 @@ qemuProcessReconnect(void *opaque)
virQEMUDriverPtr driver = data->driver;
virDomainObjPtr obj = data->obj;
qemuDomainObjPrivatePtr priv;
- virConnectPtr conn = data->conn;
struct qemuDomainJobObj oldjob;
int state;
int reason;
@@ -7501,7 +7499,6 @@ qemuProcessReconnect(void *opaque)
qemuDomainRemoveInactiveJob(driver, obj);
}
virDomainObjEndAPI(&obj);
- virObjectUnref(conn);
virObjectUnref(cfg);
virObjectUnref(caps);
virNWFilterUnlockFilterUpdates();
@@ -7557,12 +7554,6 @@ qemuProcessReconnectHelper(virDomainObjPtr obj,
virObjectLock(obj);
virObjectRef(obj);
- /* Since we close the connection later on, we have to make sure that the
- * threads we start see a valid connection throughout their lifetime. We
- * simply increase the reference counter here.
- */
- virObjectRef(data->conn);
-
if (virThreadCreate(&thread, false, qemuProcessReconnect, data) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not create thread. QEMU initialization "
@@ -7578,7 +7569,6 @@ qemuProcessReconnectHelper(virDomainObjPtr obj,
virDomainObjEndAPI(&obj);
virNWFilterUnlockFilterUpdates();
- virObjectUnref(data->conn);
VIR_FREE(data);
return -1;
}
@@ -7593,8 +7583,8 @@ qemuProcessReconnectHelper(virDomainObjPtr obj,
* about.
*/
void
-qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver)
+qemuProcessReconnectAll(virQEMUDriverPtr driver)
{
- struct qemuProcessReconnectData data = {.conn = conn, .driver = driver};
+ struct qemuProcessReconnectData data = {.driver = driver};
virDomainObjListForEach(driver->domains, qemuProcessReconnectHelper, &data);
}
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 1bc1203c18..2741115673 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -47,7 +47,7 @@ int qemuProcessDestroyMemoryBackingPath(virQEMUDriverPtr driver,
virDomainMemoryDefPtr mem);
void qemuProcessAutostartAll(virQEMUDriverPtr driver);
-void qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver);
+void qemuProcessReconnectAll(virQEMUDriverPtr driver);
typedef struct _qemuProcessIncomingDef qemuProcessIncomingDef;
typedef qemuProcessIncomingDef *qemuProcessIncomingDefPtr;
--
2.14.3