[libvirt PATCH v2 08/13] nwfilter_learnipaddr: Use automatic mutex management

Tim Wiederhake twiederh at redhat.com
Wed Mar 16 22:10:37 UTC 2022


Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
---
 src/nwfilter/nwfilter_learnipaddr.c | 83 +++++++++--------------------
 1 file changed, 24 insertions(+), 59 deletions(-)

diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
index 99bffdc4fb..2c85972012 100644
--- a/src/nwfilter/nwfilter_learnipaddr.c
+++ b/src/nwfilter/nwfilter_learnipaddr.c
@@ -143,11 +143,9 @@ static bool threadsTerminate;
 int
 virNWFilterLockIface(const char *ifname)
 {
-    virNWFilterIfaceLock *ifaceLock;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&ifaceMapLock);
+    virNWFilterIfaceLock *ifaceLock = virHashLookup(ifaceLockMap, ifname);
 
-    virMutexLock(&ifaceMapLock);
-
-    ifaceLock = virHashLookup(ifaceLockMap, ifname);
     if (!ifaceLock) {
         ifaceLock = g_new0(virNWFilterIfaceLock, 1);
 
@@ -155,21 +153,20 @@ virNWFilterLockIface(const char *ifname)
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("mutex initialization failed"));
             g_free(ifaceLock);
-            goto error;
+            return -1;
         }
 
         if (virStrcpyStatic(ifaceLock->ifname, ifname) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("interface name %s does not fit into "
-                             "buffer "),
+                           _("interface name %s does not fit into buffer"),
                            ifaceLock->ifname);
             g_free(ifaceLock);
-            goto error;
+            return -1;
         }
 
         while (virHashAddEntry(ifaceLockMap, ifname, ifaceLock)) {
             g_free(ifaceLock);
-            goto error;
+            return -1;
         }
 
         ifaceLock->refctr = 0;
@@ -177,27 +174,17 @@ virNWFilterLockIface(const char *ifname)
 
     ifaceLock->refctr++;
 
-    virMutexUnlock(&ifaceMapLock);
-
     virMutexLock(&ifaceLock->lock);
 
     return 0;
-
- error:
-    virMutexUnlock(&ifaceMapLock);
-
-    return -1;
 }
 
 
 void
 virNWFilterUnlockIface(const char *ifname)
 {
-    virNWFilterIfaceLock *ifaceLock;
-
-    virMutexLock(&ifaceMapLock);
-
-    ifaceLock = virHashLookup(ifaceLockMap, ifname);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&ifaceMapLock);
+    virNWFilterIfaceLock *ifaceLock = virHashLookup(ifaceLockMap, ifname);
 
     if (ifaceLock) {
         virMutexUnlock(&ifaceLock->lock);
@@ -206,8 +193,6 @@ virNWFilterUnlockIface(const char *ifname)
         if (ifaceLock->refctr == 0)
             virHashRemoveEntry(ifaceLockMap, ifname);
     }
-
-    virMutexUnlock(&ifaceMapLock);
 }
 
 
@@ -228,17 +213,13 @@ virNWFilterIPAddrLearnReqFree(virNWFilterIPAddrLearnReq *req)
 static int
 virNWFilterRegisterLearnReq(virNWFilterIPAddrLearnReq *req)
 {
-    int res = -1;
     g_autofree char *ifindex_str = g_strdup_printf("%d", req->ifindex);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
 
-    virMutexLock(&pendingLearnReqLock);
-
-    if (!virHashLookup(pendingLearnReq, ifindex_str))
-        res = virHashAddEntry(pendingLearnReq, ifindex_str, req);
-
-    virMutexUnlock(&pendingLearnReqLock);
+    if (virHashLookup(pendingLearnReq, ifindex_str))
+        return -1;
 
-    return res;
+    return virHashAddEntry(pendingLearnReq, ifindex_str, req);
 }
 
 
@@ -247,9 +228,7 @@ virNWFilterRegisterLearnReq(virNWFilterIPAddrLearnReq *req)
 int
 virNWFilterTerminateLearnReq(const char *ifname)
 {
-    int rc = -1;
     int ifindex;
-    virNWFilterIPAddrLearnReq *req;
     g_autofree char *ifindex_str = NULL;
 
     /* It's possible that it's already been removed as a result of
@@ -262,38 +241,30 @@ virNWFilterTerminateLearnReq(const char *ifname)
 
     if (virNetDevGetIndex(ifname, &ifindex) < 0) {
         virResetLastError();
-        return rc;
+        return -1;
     }
 
     ifindex_str = g_strdup_printf("%d", ifindex);
 
-    virMutexLock(&pendingLearnReqLock);
-
-    req = virHashLookup(pendingLearnReq, ifindex_str);
-    if (req) {
-        rc = 0;
-        req->terminate = true;
+    VIR_WITH_MUTEX_LOCK_GUARD(&pendingLearnReqLock) {
+        virNWFilterIPAddrLearnReq *req;
+        if ((req = virHashLookup(pendingLearnReq, ifindex_str))) {
+            req->terminate = true;
+            return 0;
+        }
     }
 
-    virMutexUnlock(&pendingLearnReqLock);
-
-    return rc;
+    return -1;
 }
 
 
 bool
 virNWFilterHasLearnReq(int ifindex)
 {
-    void *res;
     g_autofree char *ifindex_str = g_strdup_printf("%d", ifindex);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
 
-    virMutexLock(&pendingLearnReqLock);
-
-    res = virHashLookup(pendingLearnReq, ifindex_str);
-
-    virMutexUnlock(&pendingLearnReqLock);
-
-    return res != NULL;
+    return virHashLookup(pendingLearnReq, ifindex_str) != NULL;
 }
 
 
@@ -309,16 +280,10 @@ freeLearnReqEntry(void *payload)
 static virNWFilterIPAddrLearnReq *
 virNWFilterDeregisterLearnReq(int ifindex)
 {
-    virNWFilterIPAddrLearnReq *res;
     g_autofree char *ifindex_str = g_strdup_printf("%d", ifindex);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&pendingLearnReqLock);
 
-    virMutexLock(&pendingLearnReqLock);
-
-    res = virHashSteal(pendingLearnReq, ifindex_str);
-
-    virMutexUnlock(&pendingLearnReqLock);
-
-    return res;
+    return virHashSteal(pendingLearnReq, ifindex_str);
 }
 
 #endif
-- 
2.31.1



More information about the libvir-list mailing list