On Tue, Mar 10, 2015 at 17:45:18 +0100, Michal Privoznik wrote:
Now that we have fine grained locks, there's no need to
lock the whole driver. We can rely on self-locking APIs.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/network/bridge_driver.c | 71 ------------------------------------
src/network/bridge_driver_platform.h | 2 -
tests/objectlocking.ml | 2 -
3 files changed, 75 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 5ef9910..c6957c3 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -88,16 +88,6 @@ VIR_LOG_INIT("network.bridge_driver");
static virNetworkDriverStatePtr driver;
-
-static void networkDriverLock(void)
-{
- virMutexLock(&driver->lock);
-}
-static void networkDriverUnlock(void)
-{
- virMutexUnlock(&driver->lock);
-}
-
static int networkStateCleanup(void);
static int networkStartNetwork(virNetworkObjPtr network);
@@ -129,9 +119,7 @@ networkObjFromNetwork(virNetworkPtr net)
virNetworkObjPtr network;
char uuidstr[VIR_UUID_STRING_BUFLEN];
- networkDriverLock();
network = virNetworkObjFindByUUID(driver->networks, net->uuid);
- networkDriverUnlock();
if (!network) {
virUUIDFormat(net->uuid, uuidstr);
@@ -557,12 +545,6 @@ networkStateInitialize(bool privileged,
if (VIR_ALLOC(driver) < 0)
goto error;
- if (virMutexInit(&driver->lock) < 0) {
- VIR_FREE(driver);
- goto error;
- }
- networkDriverLock();
-
/* configuration/state paths are one of
* ~/.config/libvirt/... (session/unprivileged)
* /etc/libvirt/... && /var/(run|lib)/libvirt/... (system/privileged).
@@ -648,8 +630,6 @@ networkStateInitialize(bool privileged,
driver->networkEventState = virObjectEventStateNew();
- networkDriverUnlock();
-
#ifdef HAVE_FIREWALLD
if (!(sysbus = virDBusGetSystemBus())) {
virErrorPtr err = virGetLastError();
@@ -683,8 +663,6 @@ networkStateInitialize(bool privileged,
return ret;
error:
- if (driver)
- networkDriverUnlock();
networkStateCleanup();
goto cleanup;
}
@@ -700,11 +678,9 @@ networkStateAutoStart(void)
if (!driver)
return;
- networkDriverLock();
virNetworkObjListForEach(driver->networks,
networkAutostartConfig,
Although it's not obvious as the @driver isn't passed explicitly this
internally calls networkStartDhcpDaemon which accesses
@driver->dnsmasqStateDir which isn't immutable.
Having the access to @driver hidden by the access to a global variable
is really sneaky. I'd prefer if we'd pass it explicitly in this case.
NULL);
- networkDriverUnlock();
}
/**
@@ -719,7 +695,6 @@ networkStateReload(void)
if (!driver)
return 0;
- networkDriverLock();
virNetworkLoadAllState(driver->networks,
driver->stateDir);
virNetworkLoadAllConfigs(driver->networks,
@@ -730,7 +705,6 @@ networkStateReload(void)
virNetworkObjListForEach(driver->networks,
networkAutostartConfig,
same problem as above
NULL);
- networkDriverUnlock();
return 0;
}
@@ -746,8 +720,6 @@ networkStateCleanup(void)
if (!driver)
return -1;
- networkDriverLock();
-
virObjectEventStateFree(driver->networkEventState);
/* free inactive networks */
@@ -762,9 +734,6 @@ networkStateCleanup(void)
virObjectUnref(driver->dnsmasqCaps);
- networkDriverUnlock();
- virMutexDestroy(&driver->lock);
-
VIR_FREE(driver);
return 0;
@@ -2478,9 +2447,7 @@ static virNetworkPtr networkLookupByUUID(virConnectPtr conn,
virNetworkObjPtr network;
virNetworkPtr ret = NULL;
- networkDriverLock();
network = virNetworkObjFindByUUID(driver->networks, uuid);
- networkDriverUnlock();
if (!network) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(uuid, uuidstr);
@@ -2506,9 +2473,7 @@ static virNetworkPtr networkLookupByName(virConnectPtr conn,
virNetworkObjPtr network;
virNetworkPtr ret = NULL;
- networkDriverLock();
network = virNetworkObjFindByName(driver->networks, name);
- networkDriverUnlock();
if (!network) {
virReportError(VIR_ERR_NO_NETWORK,
_("no network with matching name '%s'"),
name);
@@ -2532,12 +2497,10 @@ static int networkConnectNumOfNetworks(virConnectPtr conn)
if (virConnectNumOfNetworksEnsureACL(conn) < 0)
return -1;
- networkDriverLock();
nactive = virNetworkObjListNumOfNetworks(driver->networks,
true,
virConnectNumOfNetworksCheckACL,
conn);
- networkDriverUnlock();
return nactive;
}
@@ -2548,12 +2511,10 @@ static int networkConnectListNetworks(virConnectPtr conn, char
**const names, in
if (virConnectListNetworksEnsureACL(conn) < 0)
return -1;
- networkDriverLock();
got = virNetworkObjListGetNames(driver->networks,
true, names, nnames,
virConnectListNetworksCheckACL,
conn);
- networkDriverUnlock();
return got;
}
@@ -2565,12 +2526,10 @@ static int networkConnectNumOfDefinedNetworks(virConnectPtr
conn)
if (virConnectNumOfDefinedNetworksEnsureACL(conn) < 0)
return -1;
- networkDriverLock();
ninactive = virNetworkObjListNumOfNetworks(driver->networks,
false,
virConnectNumOfDefinedNetworksCheckACL,
conn);
- networkDriverUnlock();
return ninactive;
}
@@ -2581,12 +2540,10 @@ static int networkConnectListDefinedNetworks(virConnectPtr conn,
char **const na
if (virConnectListDefinedNetworksEnsureACL(conn) < 0)
return -1;
- networkDriverLock();
got = virNetworkObjListGetNames(driver->networks,
false, names, nnames,
virConnectListDefinedNetworksCheckACL,
conn);
- networkDriverUnlock();
return got;
}
@@ -2602,11 +2559,9 @@ networkConnectListAllNetworks(virConnectPtr conn,
if (virConnectListAllNetworksEnsureACL(conn) < 0)
goto cleanup;
- networkDriverLock();
ret = virNetworkObjListExport(conn, driver->networks, nets,
virConnectListAllNetworksCheckACL,
flags);
- networkDriverUnlock();
cleanup:
return ret;
@@ -2917,8 +2872,6 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, const
char *xml)
virNetworkPtr ret = NULL;
virObjectEventPtr event = NULL;
- networkDriverLock();
This function will have the same problem as it starts the network.
-
if (!(def = virNetworkDefParseString(xml)))
goto cleanup;
@@ -2955,7 +2908,6 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, const
char *xml)
if (event)
virObjectEventStateQueue(driver->networkEventState, event);
virNetworkObjEndAPI(&network);
- networkDriverUnlock();
return ret;
}
@@ -2967,8 +2919,6 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, const
char *xml)
virNetworkPtr ret = NULL;
virObjectEventPtr event = NULL;
- networkDriverLock();
-
if (!(def = virNetworkDefParseString(xml)))
goto cleanup;
@@ -3010,7 +2960,6 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, const
char *xml)
if (freeDef)
virNetworkDefFree(def);
virNetworkObjEndAPI(&network);
- networkDriverUnlock();
return ret;
}
@@ -3022,8 +2971,6 @@ networkUndefine(virNetworkPtr net)
bool active = false;
virObjectEventPtr event = NULL;
- networkDriverLock();
-
network = virNetworkObjFindByUUID(driver->networks, net->uuid);
if (!network) {
virReportError(VIR_ERR_NO_NETWORK,
@@ -3067,7 +3014,6 @@ networkUndefine(virNetworkPtr net)
if (event)
virObjectEventStateQueue(driver->networkEventState, event);
virNetworkObjEndAPI(&network);
- networkDriverUnlock();
return ret;
}
@@ -3091,8 +3037,6 @@ networkUpdate(virNetworkPtr net,
VIR_NETWORK_UPDATE_AFFECT_CONFIG,
-1);
- networkDriverLock();
-
This API is restarting the DHCP daemon in some cases so it will share
the problem above.
network = virNetworkObjFindByUUID(driver->networks,
net->uuid);
if (!network) {
virReportError(VIR_ERR_NO_NETWORK,
@@ -3238,7 +3182,6 @@ networkUpdate(virNetworkPtr net,
ret = 0;
cleanup:
virNetworkObjEndAPI(&network);
- networkDriverUnlock();
return ret;
}
@@ -3248,7 +3191,6 @@ static int networkCreate(virNetworkPtr net)
int ret = -1;
virObjectEventPtr event = NULL;
- networkDriverLock();
network = virNetworkObjFindByUUID(driver->networks, net->uuid);
here too
if (!network) {
@@ -3272,7 +3214,6 @@ static int networkCreate(virNetworkPtr net)
if (event)
virObjectEventStateQueue(driver->networkEventState, event);
virNetworkObjEndAPI(&network);
- networkDriverUnlock();
return ret;
}
The driver lock can't be dropped in that case. I think we can employ a
similar mechanism as in qemu driver, where data that changes is stored
in a reference counted object and the object pointer is replaced under a
lock in case it's required to change the data.
The rest of the driver lock dropping looks okay to me though.
Peter