Re: [libvirt PATCH 03/12] nwfilter_driver: Use automatic mutex management

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 09, 2022 at 12:02:21PM +0100, Tim Wiederhake wrote:
> Signed-off-by: Tim Wiederhake <twiederh@xxxxxxxxxx>
> ---
>  src/nwfilter/nwfilter_driver.c | 83 +++++++++++++---------------------
>  1 file changed, 32 insertions(+), 51 deletions(-)
> 
> diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
> index 8eea9e5805..12bbbc661f 100644
> --- a/src/nwfilter/nwfilter_driver.c
> +++ b/src/nwfilter/nwfilter_driver.c
> @@ -57,15 +57,6 @@ static int nwfilterStateReload(void);
>  
>  static virMutex mutex = VIR_MUTEX_INITIALIZER;
>  
> -static void nwfilterDriverLock(void)
> -{
> -    virMutexLock(&mutex);
> -}
> -static void nwfilterDriverUnlock(void)
> -{
> -    virMutexUnlock(&mutex);
> -}
> -
>  #ifdef WITH_FIREWALLD
>  
>  static void
> @@ -204,6 +195,7 @@ nwfilterStateInitialize(bool privileged,
>                          virStateInhibitCallback callback G_GNUC_UNUSED,
>                          void *opaque G_GNUC_UNUSED)
>  {
> +    VIR_LOCK_GUARD lock = virLockGuardLock(&mutex);
>      GDBusConnection *sysbus = NULL;
>  
>      if (root != NULL) {
> @@ -230,8 +222,6 @@ nwfilterStateInitialize(bool privileged,
>      if (!privileged)
>          return VIR_DRV_STATE_INIT_SKIPPED;
>  
> -    nwfilterDriverLock();
> -
>      driver->stateDir = g_strdup(RUNSTATEDIR "/libvirt/nwfilter");
>  
>      if (g_mkdir_with_parents(driver->stateDir, S_IRWXU) < 0) {
> @@ -290,13 +280,10 @@ nwfilterStateInitialize(bool privileged,
>      if (virNWFilterBuildAll(driver, false) < 0)
>          goto error;
>  
> -    nwfilterDriverUnlock();
> -
>      return VIR_DRV_STATE_INIT_COMPLETE;
>  
>   error:
> -    nwfilterDriverUnlock();
> -    nwfilterStateCleanup();
> +    nwfilterStateCleanupLocked();
>  
>      return VIR_DRV_STATE_INIT_ERROR;
>  
> @@ -335,16 +322,15 @@ nwfilterStateReload(void)
>      /* shut down all threads -- they will be restarted if necessary */
>      virNWFilterLearnThreadsTerminate(true);
>  
> -    nwfilterDriverLock();
> -    virNWFilterWriteLockFilterUpdates();
> -
> -    virNWFilterObjListLoadAllConfigs(driver->nwfilters, driver->configDir);
> +    VIR_WITH_MUTEX_LOCK_GUARD(&mutex) {
> +        virNWFilterWriteLockFilterUpdates();
>  
> -    virNWFilterUnlockFilterUpdates();
> +        virNWFilterObjListLoadAllConfigs(driver->nwfilters, driver->configDir);
>  
> -    virNWFilterBuildAll(driver, false);
> +        virNWFilterUnlockFilterUpdates();
>  
> -    nwfilterDriverUnlock();
> +        virNWFilterBuildAll(driver, false);
> +    }
>  
>      return 0;
>  }
> @@ -422,13 +408,13 @@ static virNWFilterPtr
>  nwfilterLookupByUUID(virConnectPtr conn,
>                       const unsigned char *uuid)
>  {
> -    virNWFilterObj *obj;
> +    virNWFilterObj *obj = NULL;
>      virNWFilterDef *def;
>      virNWFilterPtr nwfilter = NULL;
>  
> -    nwfilterDriverLock();
> -    obj = nwfilterObjFromNWFilter(uuid);
> -    nwfilterDriverUnlock();
> +    VIR_WITH_MUTEX_LOCK_GUARD(&mutex) {
> +        obj = nwfilterObjFromNWFilter(uuid);
> +    }
>  
>      if (!obj)
>          return NULL;
> @@ -449,13 +435,13 @@ static virNWFilterPtr
>  nwfilterLookupByName(virConnectPtr conn,
>                       const char *name)
>  {
> -    virNWFilterObj *obj;
> +    virNWFilterObj *obj = NULL;
>      virNWFilterDef *def;
>      virNWFilterPtr nwfilter = NULL;
>  
> -    nwfilterDriverLock();
> -    obj = virNWFilterObjListFindByName(driver->nwfilters, name);
> -    nwfilterDriverUnlock();
> +    VIR_WITH_MUTEX_LOCK_GUARD(&mutex) {
> +        obj = virNWFilterObjListFindByName(driver->nwfilters, name);
> +    }
>  
>      if (!obj) {
>          virReportError(VIR_ERR_NO_NWFILTER,
> @@ -491,17 +477,16 @@ nwfilterConnectListNWFilters(virConnectPtr conn,
>                               char **const names,
>                               int maxnames)
>  {
> -    int nnames;
> +    VIR_LOCK_GUARD lock = { NULL };

This is introducing a 3rd locking pattern, not used in any other
conversions until now, which feels undesirable to me...

>  
>      if (virConnectListNWFiltersEnsureACL(conn) < 0)
>          return -1;
>  
> -    nwfilterDriverLock();
> -    nnames = virNWFilterObjListGetNames(driver->nwfilters, conn,
> -                                    virConnectListNWFiltersCheckACL,
> -                                    names, maxnames);
> -    nwfilterDriverUnlock();
> -    return nnames;
> +    lock = virLockGuardLock(&mutex);
> +
> +    return virNWFilterObjListGetNames(driver->nwfilters, conn,
> +                                      virConnectListNWFiltersCheckACL,
> +                                      names, maxnames);

...why isn't this just using VIR_WITH_MUTEX_LOCK_GUARD if we
don't want the critical section to cover the entire method.

Same point for any other case of the same pattern through
this series.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux