Thread (40 messages) flat view 40 messages, 4 authors, 2020-07-30

Re: [PATCH v8 bpf-next 08/13] bpf: Add BTF_SET_START/END macros

From: Jiri Olsa <hidden>
Date: 2020-07-29 11:54:43
Also in: bpf

On Tue, Jul 28, 2020 at 12:39:06PM -0700, Andrii Nakryiko wrote:

SNIP
[...]
quoted
+#define BTF_SET_START(name)                            \
+__BTF_ID_LIST(name, local)                             \
+asm(                                                   \
+".pushsection " BTF_IDS_SECTION ",\"a\";       \n"     \
+".local __BTF_ID__set__" #name ";              \n"     \
+"__BTF_ID__set__" #name ":;                    \n"     \
+".zero 4                                       \n"     \
+".popsection;                                  \n");
+
+#define BTF_SET_END(name)                              \
+asm(                                                   \
+".pushsection " BTF_IDS_SECTION ",\"a\";      \n"      \
+".size __BTF_ID__set__" #name ", .-" #name "  \n"      \
+".popsection;                                 \n");    \
+extern struct btf_id_set name;
+
 #else
This local symbol assumption will probably at some point bite us.
Yonghong already did global vs static variants for BTF ID list, we'll
end up doing something like that for sets of BTF IDs as well. Let's do
this similarly from the get go.
sure, will add that
quoted
 #define BTF_ID_LIST(name) static u32 name[5];
 #define BTF_ID(prefix, name)
 #define BTF_ID_UNUSED
 #define BTF_ID_LIST_GLOBAL(name) u32 name[1];
+#define BTF_SET_START(name) static struct btf_id_set name = { 0 };
nit: this zero is unnecessary and misleading (it's initialized for
only the first member of a struct). Just {} is enough.
ok
quoted
+#define BTF_SET_END(name)

 #endif /* CONFIG_DEBUG_INFO_BTF */
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 562d4453fad3..06714cdda0a9 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -21,6 +21,8 @@
 #include <linux/btf_ids.h>
 #include <linux/skmsg.h>
 #include <linux/perf_event.h>
+#include <linux/bsearch.h>
+#include <linux/btf_ids.h>
 #include <net/sock.h>

 /* BTF (BPF Type Format) is the meta data format which describes
@@ -4740,3 +4742,15 @@ u32 btf_id(const struct btf *btf)
 {
        return btf->id;
 }
+
+static int btf_id_cmp_func(const void *a, const void *b)
+{
+       const int *pa = a, *pb = b;
+
+       return *pa - *pb;
+}
+
+bool btf_id_set_contains(struct btf_id_set *set, u32 id)
+{
+       return bsearch(&id, set->ids, set->cnt, sizeof(int), btf_id_cmp_func) != NULL;
very nit ;) sizeof(__u32)
sure ;-)

thanks,
jirka
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help