]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Align qpzone lock and db refcount 12513/head
authorAlessio Podda <alessio@isc.org>
Mon, 3 Aug 2026 14:31:31 +0000 (16:31 +0200)
committerAlessio Podda <alessio@isc.org>
Thu, 13 Aug 2026 17:06:27 +0000 (19:06 +0200)
The qpzone refcount is the probably the most conteded refcount for
workloads with a single zone such as TLDs.

Add alignment to both the refcount and qpzone dblock to avoid false
sharing.

lib/dns/qpzone.c
tests/dns/qpzone_test.c

index 43de5890018d19add8fe5beb1f74f5fecca5bd8d..bf5f38633b935790fd60f651fe52e6d3f707719c 100644 (file)
@@ -214,7 +214,7 @@ struct qpzonedb {
        /* Unlocked. */
        dns_db_t common;
        /* Locks the data in this struct */
-       isc_rwlock_t lock;
+       __attribute__((aligned(ISC_OS_CACHELINE_SIZE))) isc_rwlock_t lock;
 
        /*
         * NOTE: 'references' is NOT the global reference counter for
@@ -579,7 +579,8 @@ free_db_rcu(struct rcu_head *rcu_head) {
                INSIST(!cds_lfht_destroy(qpdb->common.update_listeners, NULL));
        }
 
-       isc_mem_putanddetach(&qpdb->common.mctx, qpdb, sizeof(*qpdb));
+       isc_mem_putanddetachx(&qpdb->common.mctx, qpdb, sizeof(*qpdb),
+                             ISC_MEM_ALIGN(ISC_OS_CACHELINE_SIZE));
 }
 
 static void
@@ -863,7 +864,8 @@ dns__qpzone_create(isc_mem_t *mctx, const dns_name_t *origin, dns_dbtype_t type,
        isc_result_t result;
        dns_qp_t *qp = NULL;
 
-       qpdb = isc_mem_get(mctx, sizeof(*qpdb));
+       qpdb = isc_mem_getx(mctx, sizeof(*qpdb),
+                           ISC_MEM_ALIGN(ISC_OS_CACHELINE_SIZE));
        *qpdb = (qpzonedb_t){
                .common.origin = DNS_NAME_INITEMPTY,
                .common.rdclass = rdclass,
index 104ac15699d8965ea794617dc18e151703fcd63a..315aec7866f8a0a6fdf3707b8c0fe8d8d63cc9c4 100644 (file)
@@ -180,7 +180,8 @@ static dns_rdata_rrsig_t rrsig_test_data2 = {
 static bool
 ownercase_test_one(const char *str1, const char *str2) {
        isc_result_t result;
-       uint8_t qpdb_s[sizeof(qpzonedb_t) + sizeof(qpzone_bucket_t)];
+       alignas(qpzonedb_t)
+               uint8_t qpdb_s[sizeof(qpzonedb_t) + sizeof(qpzone_bucket_t)];
        qpzonedb_t *qpdb = (qpzonedb_t *)&qpdb_s;
        *qpdb = (qpzonedb_t){
                .common.methods = &qpdb_zonemethods,
@@ -345,7 +346,8 @@ verify_aaaa_records(dns_db_t *db, dns_dbversion_t *version,
 
 ISC_RUN_TEST_IMPL(setownercase) {
        isc_result_t result;
-       uint8_t qpdb_s[sizeof(qpzonedb_t) + sizeof(qpzone_bucket_t)];
+       alignas(qpzonedb_t)
+               uint8_t qpdb_s[sizeof(qpzonedb_t) + sizeof(qpzone_bucket_t)];
        qpzonedb_t *qpdb = (qpzonedb_t *)&qpdb_s;
        *qpdb = (qpzonedb_t){
                .common.methods = &qpdb_zonemethods,