1 Fix libbpf hashmap on (I)LP32 architectures
3 On ILP32, 64-bit result was shifted by value calculated for 32-bit long type
4 and returned value was much outside hashmap capacity.
5 As advised by Andrii Nakryiko, this patch uses different hashing variant for
6 architectures with size_t shorter than long long.
8 --- linux-5.7/tools/lib/bpf/hashmap.h.orig 2020-06-01 01:49:15.000000000 +0200
9 +++ linux-5.7/tools/lib/bpf/hashmap.h 2020-06-21 15:22:07.298466419 +0200
15 -#define __WORDSIZE (__SIZEOF_LONG__ * 8)
18 static inline size_t hash_bits(size_t h, int bits)
20 /* shuffle bits and return requested number of upper bits */
21 - return (h * 11400714819323198485llu) >> (__WORDSIZE - bits);
22 +#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__)
24 + return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits);
25 +#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__)
26 + return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits);
28 +# error "Unsupported size_t size"
32 typedef size_t (*hashmap_hash_fn)(const void *key, void *ctx);