From: Evan Hunt Date: Tue, 28 Nov 2023 23:05:55 +0000 (-0800) Subject: release RCU in dns_qpmulti_snapshot() X-Git-Tag: v9.19.22~4^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2222728a4f6f5bbdceadfc7c6d156d37391b989f;p=thirdparty%2Fbind9.git release RCU in dns_qpmulti_snapshot() previously, an RCU critical section was held open for the duration of a snapshot. this should not be necessary, as the snapshot makes local copies of QP trie metadata, and it causes problems when a DB iterator is held open between two loop events. we now call rcu_read_unlock() after setting up the snapshot. --- diff --git a/lib/dns/qp.c b/lib/dns/qp.c index 4ea05e09683..4e70fa0dac4 100644 --- a/lib/dns/qp.c +++ b/lib/dns/qp.c @@ -1391,6 +1391,8 @@ dns_qpmulti_snapshot(dns_qpmulti_t *multi, dns_qpsnap_t **qpsp) { *qpsp = qps; UNLOCK(&multi->mutex); + + rcu_read_unlock(); } void @@ -1417,8 +1419,6 @@ dns_qpsnap_destroy(dns_qpmulti_t *multi, dns_qpsnap_t **qpsp) { *qpsp = NULL; UNLOCK(&multi->mutex); - - rcu_read_unlock(); } /***********************************************************************