From: Alessio Podda Date: Mon, 3 Aug 2026 14:31:31 +0000 (+0200) Subject: Align qpzone lock and db refcount X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cbbc68566bb3fd66da6627229886fd58889ecd69;p=thirdparty%2Fbind9.git Align qpzone lock and db refcount 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. --- diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 43de5890018..bf5f38633b9 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -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, diff --git a/tests/dns/qpzone_test.c b/tests/dns/qpzone_test.c index 104ac15699d..315aec7866f 100644 --- a/tests/dns/qpzone_test.c +++ b/tests/dns/qpzone_test.c @@ -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,