]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Rely on call_rcu() to destroy the qpzone outside of locks
authorOndřej Surý <ondrej@isc.org>
Tue, 4 Feb 2025 17:02:29 +0000 (18:02 +0100)
committerOndřej Surý <ondrej@isc.org>
Tue, 4 Feb 2025 22:28:53 +0000 (23:28 +0100)
Reduce the number of qpzone_ref() and qpzone_unref() calls in
qpzone_detachnode() by relying on the call_rcu to delay
the destruction of the lock buckets.

(cherry picked from commit 1fa5219fdfdec78d71b9fc270f87fa068a98f2a6)

lib/dns/qpcache.c
lib/dns/qpzone.c

index a0a1cf57fe02cd488391daacb92f1284f11f42f3..869601f1bab8eb27dc9565f93af7cd01f2b9fe24 100644 (file)
@@ -28,7 +28,7 @@
 #include <isc/loop.h>
 #include <isc/mem.h>
 #include <isc/mutex.h>
-#include <isc/once.h>
+#include <isc/os.h>
 #include <isc/queue.h>
 #include <isc/random.h>
 #include <isc/refcount.h>
index 07d18367b925865c91292618b8afab3728cc80cd..a78192c81b71be31750ba91663f130f068486a37 100644 (file)
@@ -28,7 +28,7 @@
 #include <isc/loop.h>
 #include <isc/mem.h>
 #include <isc/mutex.h>
-#include <isc/once.h>
+#include <isc/os.h>
 #include <isc/random.h>
 #include <isc/refcount.h>
 #include <isc/result.h>
@@ -3862,17 +3862,15 @@ detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) {
        nlock = &qpdb->buckets[node->locknum].lock;
 
        /*
-        * We can't destroy qpzonedb while holding a nodelock, so
-        * we need to reference it before acquiring the lock
-        * and release it afterward.
+        * qpzone_destroy() uses call_rcu() API to destroy the node locks,
+        * so it is safe to call it in the middle of NODE_LOCK.
         */
-       qpzonedb_ref(qpdb);
 
+       rcu_read_lock();
        NODE_RDLOCK(nlock, &nlocktype);
        qpznode_release(qpdb, node, 0, &nlocktype DNS__DB_FLARG_PASS);
        NODE_UNLOCK(nlock, &nlocktype);
-
-       qpzonedb_detach(&qpdb);
+       rcu_read_unlock();
 }
 
 static unsigned int