[PATCH bpf-next 1/2] bpf: btf: Support optional flags for BTF_SET8 sets

From: Daniel Xu
Date: Wed Jan 03 2024 - 18:32:48 EST


This commit adds support for optional flags on BTF_SET8s.
struct btf_id_set8 already supported 32 bits worth of flags, but was
only used for alignment purposes before.

We now use these bits to encode flags. The next commit will tag all
kfunc sets with a flag so that pahole can recognize which
BTF_ID_FLAGS(func, ..) are actual kfuncs.

Signed-off-by: Daniel Xu <dxu@xxxxxxxxx>
---
include/linux/btf_ids.h | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/include/linux/btf_ids.h b/include/linux/btf_ids.h
index a9cb10b0e2e9..88f914579fa1 100644
--- a/include/linux/btf_ids.h
+++ b/include/linux/btf_ids.h
@@ -183,17 +183,21 @@ extern struct btf_id_set name;
* .word (1 << 3) | (1 << 1) | (1 << 2)
*
*/
-#define __BTF_SET8_START(name, scope) \
+#define ___BTF_SET8_START(name, scope, flags) \
asm( \
".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \
"." #scope " __BTF_ID__set8__" #name "; \n" \
"__BTF_ID__set8__" #name ":; \n" \
-".zero 8 \n" \
+".zero 4 \n" \
+".long " #flags "\n" \
".popsection; \n");

-#define BTF_SET8_START(name) \
+#define __BTF_SET8_START(name, scope, flags, ...) \
+___BTF_SET8_START(name, scope, flags)
+
+#define BTF_SET8_START(name, ...) \
__BTF_ID_LIST(name, local) \
-__BTF_SET8_START(name, local)
+__BTF_SET8_START(name, local, ##__VA_ARGS__, 0)

#define BTF_SET8_END(name) \
asm( \
@@ -214,7 +218,7 @@ extern struct btf_id_set8 name;
#define BTF_SET_START(name) static struct btf_id_set __maybe_unused name = { 0 };
#define BTF_SET_START_GLOBAL(name) static struct btf_id_set __maybe_unused name = { 0 };
#define BTF_SET_END(name)
-#define BTF_SET8_START(name) static struct btf_id_set8 __maybe_unused name = { 0 };
+#define BTF_SET8_START(name, ...) static struct btf_id_set8 __maybe_unused name = { 0 };
#define BTF_SET8_END(name)

#endif /* CONFIG_DEBUG_INFO_BTF */
--
2.42.1