From 0635bd01cbf47cf05cfa7670fe0833077ccfe6fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Thu, 12 Oct 2023 09:17:40 +0200 Subject: [PATCH] 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. --- lib/dns/adb.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 26f9885ba3..a589519f6e 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);