From: Jakub Bogusz Date: Sat, 27 Jun 2020 08:59:37 +0000 (+0200) Subject: - added bpf-upstream patch with upstream bpf/hashmap.h changes and rewritten hashmap... X-Git-Tag: auto/th/kernel-tools-5.7.0-2 X-Git-Url: http://git.pld-linux.org/?p=packages%2Fkernel-tools.git;a=commitdiff_plain;h=49505f6 - added bpf-upstream patch with upstream bpf/hashmap.h changes and rewritten hashmap patch on top of it (changing implementation not to penalize 32-bit archs by using long long) - release 2 --- diff --git a/kernel-tools-bpf-hashmap-upstream.patch b/kernel-tools-bpf-hashmap-upstream.patch new file mode 100644 index 0000000..22c53bb --- /dev/null +++ b/kernel-tools-bpf-hashmap-upstream.patch @@ -0,0 +1,80 @@ +From f516acd5397fdbb77ef0aad0798d9ef7c3001d72 Mon Sep 17 00:00:00 2001 +From: Ian Rogers +Date: Fri, 15 May 2020 09:50:02 -0700 +Subject: libbpf, hashmap: Remove unused #include + +Remove #include of libbpf_internal.h that is unused. + +Discussed in this thread: +https://lore.kernel.org/lkml/CAEf4BzZRmiEds_8R8g4vaAeWvJzPb4xYLnpF0X2VNY8oTzkphQ@mail.gmail.com/ + +Signed-off-by: Ian Rogers +Signed-off-by: Daniel Borkmann +Acked-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20200515165007.217120-3-irogers@google.com +--- + tools/lib/bpf/hashmap.h | 1 - + 1 file changed, 1 deletion(-) + +(limited to 'tools/lib/bpf/hashmap.h') + +diff --git a/tools/lib/bpf/hashmap.h b/tools/lib/bpf/hashmap.h +index bae8879cdf58..e823b35e7371 100644 +--- a/tools/lib/bpf/hashmap.h ++++ b/tools/lib/bpf/hashmap.h +@@ -15,7 +15,6 @@ + #else + #include + #endif +-#include "libbpf_internal.h" + + static inline size_t hash_bits(size_t h, int bits) + { +-- +cgit 1.2.3-1.el7 + +From 8ca8d4a841730c02e77bf3c87bf658cc44f364b9 Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 9 Jun 2020 18:16:53 -0300 +Subject: libbpf: Define __WORDSIZE if not available + +Some systems, such as Android, don't have a define for __WORDSIZE, do it +in terms of __SIZEOF_LONG__, as done in perf since 2012: + + http://git.kernel.org/torvalds/c/3f34f6c0233ae055b5 + +For reference: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html + +I build tested it here and Andrii did some Travis CI build tests too. + +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Daniel Borkmann +Acked-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20200608161150.GA3073@kernel.org +--- + tools/lib/bpf/hashmap.h | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +(limited to 'tools/lib/bpf/hashmap.h') + +diff --git a/tools/lib/bpf/hashmap.h b/tools/lib/bpf/hashmap.h +index e823b35e7371..df59fd4fc95b 100644 +--- a/tools/lib/bpf/hashmap.h ++++ b/tools/lib/bpf/hashmap.h +@@ -10,10 +10,9 @@ + + #include + #include +-#ifdef __GLIBC__ +-#include +-#else +-#include ++#include ++#ifndef __WORDSIZE ++#define __WORDSIZE (__SIZEOF_LONG__ * 8) + #endif + + static inline size_t hash_bits(size_t h, int bits) +-- +cgit 1.2.3-1.el7 + diff --git a/kernel-tools-bpf-hashmap.patch b/kernel-tools-bpf-hashmap.patch index e5300b1..18334be 100644 --- a/kernel-tools-bpf-hashmap.patch +++ b/kernel-tools-bpf-hashmap.patch @@ -1,24 +1,32 @@ -Fix broken hashmap implementation to ensure that hash_bits returns value fitting in -given bits (for bits > 0): multiplier is long long, so shift bits must be based on -long long, not __WORDSIZE. +Fix libbpf hashmap on (I)LP32 architectures + +On ILP32, 64-bit result was shifted by value calculated for 32-bit long type +and returned value was much outside hashmap capacity. +As advised by Andrii Nakryiko, this patch uses different hashing variant for +architectures with size_t shorter than long long. + --- linux-5.7/tools/lib/bpf/hashmap.h.orig 2020-06-01 01:49:15.000000000 +0200 +++ linux-5.7/tools/lib/bpf/hashmap.h 2020-06-21 15:22:07.298466419 +0200 -@@ -10,17 +10,12 @@ - +@@ -11,14 +11,18 @@ #include #include --#ifdef __GLIBC__ --#include --#else --#include + #include +-#ifndef __WORDSIZE +-#define __WORDSIZE (__SIZEOF_LONG__ * 8) -#endif - #include "libbpf_internal.h" static inline size_t hash_bits(size_t h, int bits) { /* shuffle bits and return requested number of upper bits */ - return (h * 11400714819323198485llu) >> (__WORDSIZE - bits); ++#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__) ++ /* LP64 case */ + return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits); ++#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__) ++ return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits); ++#else ++# error "Unsupported size_t size" ++#endif } typedef size_t (*hashmap_hash_fn)(const void *key, void *ctx); diff --git a/kernel-tools.spec b/kernel-tools.spec index 4891c0c..88dea12 100644 --- a/kernel-tools.spec +++ b/kernel-tools.spec @@ -25,7 +25,7 @@ Summary: Assortment of tools for the Linux kernel Summary(pl.UTF-8): Zestaw narzędzi dla jądra Linuksa Name: kernel-tools Version: %{basever}%{postver} -Release: 1 +Release: 2 License: GPL v2 Group: Applications/System Source0: https://www.kernel.org/pub/linux/kernel/v5.x/linux-%{basever}.tar.xz @@ -40,8 +40,9 @@ Patch1: x32.patch Patch2: regex.patch Patch3: %{name}-perf-update.patch Patch4: %{name}-perf-gtk2.patch -Patch5: %{name}-bpf-hashmap.patch -Patch6: %{name}-usbip-nocommon.patch +Patch5: %{name}-bpf-hashmap-upstream.patch +Patch6: %{name}-bpf-hashmap.patch +Patch7: %{name}-usbip-nocommon.patch URL: https://www.kernel.org/ BuildRequires: bison BuildRequires: docutils @@ -408,6 +409,7 @@ cd linux-%{basever} %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch7 -p1 %{__sed} -i -e '/^CFLAGS = /s/ -g / $(OPTFLAGS) /' tools/hv/Makefile %{__sed} -i -e '/^CFLAGS+=/s/ -O1 / $(OPTFLAGS) /' tools/thermal/tmon/Makefile