lib: remove overflow arithmetic from hash stats

Signed values get converted to unsigned for addition, so when the value
to adjust a stats variable for hash tables was negative this resulted in
overflow arithmetic, which we generally don't want.

Signed-off-by: Quentin Young <qlyoung@nvidia.com>
This commit is contained in:
Quentin Young 2020-09-02 16:02:55 -04:00
parent e9faf4be72
commit e6464fdc18

View File

@ -77,9 +77,20 @@ void *hash_alloc_intern(void *arg)
return arg;
}
/*
* ssq = ssq + (new^2 - old^2)
* = ssq + ((new + old) * (new - old))
*/
#define hash_update_ssq(hz, old, new) \
atomic_fetch_add_explicit(&hz->stats.ssq, (new + old) * (new - old), \
memory_order_relaxed);
do { \
int _adjust = (new + old) * (new - old); \
if (_adjust < 0) \
atomic_fetch_sub_explicit(&hz->stats.ssq, -_adjust, \
memory_order_relaxed); \
else \
atomic_fetch_add_explicit(&hz->stats.ssq, _adjust, \
memory_order_relaxed); \
} while (0)
/* Expand hash if the chain length exceeds the threshold. */
static void hash_expand(struct hash *hash)