From: Ondřej Surý Date: Thu, 12 Oct 2023 07:17:40 +0000 (+0200) Subject: Skip the no-op code in adjustsrtt() X-Git-Tag: v9.19.18~47^2~2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=0635bd01cbf47cf05cfa7670fe0833077ccfe6fe;p=thirdparty%2Fbind9.git Skip the no-op code in adjustsrtt() If factor == DNS_ADB_RTTADJAGE and addr->entry->lastage == now we would load value into new_srtt and then immediatelly store it back which triggers the synchronization between threads using .srtt values. --- diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 26f9885ba34..a589519f6ee 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -3057,18 +3057,17 @@ adjustsrtt(dns_adbaddrinfo_t *addr, unsigned int rtt, unsigned int factor, new_srtt -= addr->entry->srtt; new_srtt >>= 9; atomic_store(&addr->entry->lastage, now); - } else { - new_srtt = atomic_load(&addr->entry->srtt) + atomic_store(&addr->entry->srtt, new_srtt); + addr->srtt = new_srtt; } } else { new_srtt = ((uint64_t)atomic_load(&addr->entry->srtt) / 10 * factor) + ((uint64_t)rtt / 10 * (10 - factor)); + atomic_store(&addr->entry->srtt, new_srtt); + addr->srtt = new_srtt; } - atomic_store(&addr->entry->srtt, new_srtt); - addr->srtt = new_srtt; - (void)atomic_compare_exchange_strong(&addr->entry->expires, &(isc_stdtime_t){ 0 }, now + ADB_ENTRY_WINDOW);