From 063a881a6c6c6bd542b0c24e1fb2882f5b7b264e Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 27 Aug 2020 15:12:10 +1000 Subject: [PATCH] Use atomics to update counters. WARNING: ThreadSanitizer: data race Write of size 4 at 0x000000000001 by thread T1: #0 dns_acache_countquerymiss lib/dns/acache.c:1184:22 #1 rdataset_getadditional lib/dns/rbtdb.c:9875:3 #2 dns_rdataset_getadditional lib/dns/rdataset.c:711:11 #3 query_addadditional2 bin/named/query.c:1967:11 #4 additionaldata_ns lib/dns/./rdata/generic/ns_2.c:198:10 #5 dns_rdata_additionaldata lib/dns/rdata.c:1246:2 #6 dns_rdataset_additionaldata lib/dns/rdataset.c:629:12 #7 query_addrdataset bin/named/query.c:2411:8 #8 query_addrrset bin/named/query.c:2802:2 #9 query_find bin/named/query.c:9135:4 #10 query_resume bin/named/query.c:4164:12 #11 dispatch lib/isc/task.c:1157:7 #12 run lib/isc/task.c:1331:2 Previous write of size 4 at 0x000000000001 by thread T2: #0 dns_acache_countquerymiss lib/dns/acache.c:1184:22 #1 rdataset_getadditional lib/dns/rbtdb.c:9875:3 #2 dns_rdataset_getadditional lib/dns/rdataset.c:711:11 #3 query_addadditional2 bin/named/query.c:1967:11 #4 additionaldata_ns lib/dns/./rdata/generic/ns_2.c:198:10 #5 dns_rdata_additionaldata lib/dns/rdata.c:1246:2 #6 dns_rdataset_additionaldata lib/dns/rdataset.c:629:12 #7 query_addrdataset bin/named/query.c:2411:8 #8 query_addrrset bin/named/query.c:2802:2 #9 query_find bin/named/query.c:9135:4 #10 query_resume bin/named/query.c:4164:12 #11 dispatch lib/isc/task.c:1157:7 #12 run lib/isc/task.c:1331:2 Conflict: NA Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/063a881a6c6c6bd542b0c24e1fb2882f5b7b264e --- lib/dns/acache.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/dns/acache.c b/lib/dns/acache.c index fc6973f4cc..14ba672135 100644 --- a/lib/dns/acache.c +++ b/lib/dns/acache.c @@ -174,9 +174,24 @@ struct acache_cleaner { }; struct dns_acachestats { +#ifdef ACACHE_HAVESTDATOMIC + _Atomic(unsigned int) hits; + _Atomic(unsigned int) queries; + _Atomic(unsigned int) misses; +#define ACACHE_INC(x) atomic_fetch_add(&(x), 1) +#define ACACHE_LOAD(x) atomic_load(&(x)) +#else unsigned int hits; unsigned int queries; unsigned int misses; +#if defined(ISC_PLATFORM_HAVEXADD) +#define ACACHE_INC(x) isc_atomic_xadd((int32_t*)&(x), 1) +#define ACACHE_LOAD(x) isc_atomic_xadd((int32_t*)&(x), 0) +#else +#define ACACHE_INC(x) ((x)++) +#define ACACHE_LOAD(x) (x) +#endif +#endif unsigned int adds; unsigned int deleted; unsigned int cleaned; @@ -716,8 +731,9 @@ end_cleaning(acache_cleaner_t *cleaner, isc_event_t *event) { "cleaned=%d cleaner_runs=%d overmem=%d " "overmem_nocreates=%d nomem=%d", acache, - acache->stats.hits, acache->stats.misses, - acache->stats.queries, + ACACHE_LOAD(acache->stats.hits), + ACACHE_LOAD(acache->stats.misses), + ACACHE_LOAD(acache->stats.queries), acache->stats.adds, acache->stats.deleted, acache->stats.cleaned, acache->stats.cleaner_runs, acache->stats.overmem, acache->stats.overmem_nocreates, @@ -1181,8 +1197,8 @@ dns_acache_attach(dns_acache_t *source, dns_acache_t **targetp) { void dns_acache_countquerymiss(dns_acache_t *acache) { - acache->stats.misses++; /* XXXSK danger: unlocked! */ - acache->stats.queries++; /* XXXSK danger: unlocked! */ + ACACHE_INC(acache->stats.misses); + ACACHE_INC(acache->stats.queries); } void @@ -1529,8 +1545,8 @@ dns_acache_getentry(dns_acacheentry_t *entry, dns_zone_t **zonep, } } - entry->acache->stats.hits++; /* XXXMLG danger: unlocked! */ - entry->acache->stats.queries++; + ACACHE_INC(entry->acache->stats.hits); + ACACHE_INC(entry->acache->stats.queries); ACACHE_UNLOCK(&acache->entrylocks[locknum], isc_rwlocktype_read); -- 2.23.0