[libvirt] [PATCH v3 12/15] bridge_driver: Drop networkDriverLock() from everywhere

Peter Krempa pkrempa at redhat.com
Thu Mar 12 09:42:53 UTC 2015


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 at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150312/966f0c83/attachment-0001.sig>


More information about the libvir-list mailing list