]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: freq_ctr/threads: relax when failing to update a sliding window value
authorWilly Tarreau <w@1wt.eu>
Wed, 17 Mar 2021 18:22:03 +0000 (19:22 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 17 Mar 2021 18:36:15 +0000 (19:36 +0100)
The swrate_add* functions would sping fast on a failed CAS, better place
a cpu_relax() call there to reduce contention if any.

include/haproxy/freq_ctr.h

index 38d82fe80e7820566f8912f9eb3b68d96085e0c2..d5cea414ef15445579e22f07c43bd7b838d63686 100644 (file)
@@ -262,7 +262,7 @@ static inline unsigned int swrate_add(unsigned int *sum, unsigned int n, unsigne
        old_sum = *sum;
        do {
                new_sum = old_sum - (old_sum + n - 1) / n + v;
-       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum));
+       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum) && __ha_cpu_relax());
        return new_sum;
 }
 
@@ -280,7 +280,7 @@ static inline unsigned int swrate_add_dynamic(unsigned int *sum, unsigned int n,
        old_sum = *sum;
        do {
                new_sum = old_sum - (n ? (old_sum + n - 1) / n : 0) + v;
-       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum));
+       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum) && __ha_cpu_relax());
        return new_sum;
 }
 
@@ -314,7 +314,7 @@ static inline unsigned int swrate_add_scaled(unsigned int *sum, unsigned int n,
        old_sum = *sum;
        do {
                new_sum = old_sum + v * s - div64_32((unsigned long long)(old_sum + n) * s, n);
-       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum));
+       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum) && __ha_cpu_relax());
        return new_sum;
 }