[packages/kernel-tools] - added bpf-upstream patch with upstream bpf/hashmap.h changes and rewritten hashmap patch on top of

qboosh qboosh at pld-linux.org
Sat Jun 27 10:58:41 CEST 2020


commit 49505f6ff5a8aeb3be36bd3303f90f44dd69b6a2
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sat Jun 27 10:59:37 2020 +0200

    - 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

 kernel-tools-bpf-hashmap-upstream.patch | 80 +++++++++++++++++++++++++++++++++
 kernel-tools-bpf-hashmap.patch          | 28 +++++++-----
 kernel-tools.spec                       |  8 ++--
 3 files changed, 103 insertions(+), 13 deletions(-)
---
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
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 <irogers at google.com>
+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 <irogers at google.com>
+Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
+Acked-by: Andrii Nakryiko <andriin at fb.com>
+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 <bits/reg.h>
+ #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 <acme at kernel.org>
+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 <acme at redhat.com>
+Signed-off-by: Daniel Borkmann <daniel at iogearbox.net>
+Acked-by: Andrii Nakryiko <andriin at fb.com>
+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 <stdbool.h>
+ #include <stddef.h>
+-#ifdef __GLIBC__
+-#include <bits/wordsize.h>
+-#else
+-#include <bits/reg.h>
++#include <limits.h>
++#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 <stdbool.h>
  #include <stddef.h>
--#ifdef __GLIBC__
--#include <bits/wordsize.h>
--#else
--#include <bits/reg.h>
+ #include <limits.h>
+-#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);
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel-tools.git/commitdiff/49505f6ff5a8aeb3be36bd3303f90f44dd69b6a2



More information about the pld-cvs-commit mailing list