]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: freq_ctr: add opportunistic versions of swrate_add()
authorWilly Tarreau <w@1wt.eu>
Mon, 19 Dec 2022 16:19:45 +0000 (17:19 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 20 Dec 2022 13:51:12 +0000 (14:51 +0100)
Some uses of swrate_add() only consist in getting a rough estimate of
a frequency. There are cases where speed matters more than accuracy
(e.g. pools). For such use cases, let's just stop looping on the CAS,
if the update fails, another thread is already providing input, and
it's not dramatic to lose the race. All these functions are now
suffixed with "_opportunistic".

include/haproxy/freq_ctr.h

index fbb78520a9b7ccf6efa39b832a058e080b80829a..956061177674374c9fe1818c7620f3aa234629e4 100644 (file)
@@ -348,6 +348,41 @@ static inline unsigned int swrate_add_scaled(unsigned int *sum, unsigned int n,
        return new_sum;
 }
 
+/* opportunistic versions of the functions above: an attempt is made to update
+ * the value, but in case of contention, it's not retried. This is fine when
+ * rough estimates are needed and speed is preferred over accuracy.
+ */
+
+static inline uint swrate_add_opportunistic(uint *sum, uint n, uint v)
+{
+       uint new_sum, old_sum;
+
+       old_sum = *sum;
+       new_sum = old_sum - (old_sum + n - 1) / n + v;
+       HA_ATOMIC_CAS(sum, &old_sum, new_sum);
+       return new_sum;
+}
+
+static inline uint swrate_add_dynamic_opportunistic(uint *sum, uint n, uint v)
+{
+       uint new_sum, old_sum;
+
+       old_sum = *sum;
+       new_sum = old_sum - (n ? (old_sum + n - 1) / n : 0) + v;
+       HA_ATOMIC_CAS(sum, &old_sum, new_sum);
+       return new_sum;
+}
+
+static inline uint swrate_add_scaled_opportunistic(uint *sum, uint n, uint v, uint s)
+{
+       uint new_sum, old_sum;
+
+       old_sum = *sum;
+       new_sum = old_sum + v * s - div64_32((unsigned long long)(old_sum + n) * s, n);
+       HA_ATOMIC_CAS(sum, &old_sum, new_sum);
+       return new_sum;
+}
+
 /* Returns the average sample value for the sum <sum> over a sliding window of
  * <n> samples. Better if <n> is a power of two. It must be the same <n> as the
  * one used above in all additions.