From c4bd6f61d9ac196d84efe6cabfff07e0a50a8110 Mon Sep 17 00:00:00 2001 From: tianmuyang Date: Wed, 2 Jul 2025 10:40:47 +0800 Subject: [PATCH] libbpf: Adaption for sched type eBPF program In order to run eBPF program hooked at "sched", we need to backport some code from openEuler-kernel. Related openEuler-kernel commits: [0] https://gitee.com/openeuler/kernel/commit/f3422f4a201ef5405d6b6bc7ea2c93686adfca6f [1] https://gitee.com/openeuler/kernel/commit/95ef108bb84d9de3331b65f840a4e620e01df9fd Signed-off-by: tianmuyang --- ...Adaption-for-sched-type-eBPF-program.patch | 163 ++++++++++++++++++ libbpf.spec | 7 +- 2 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 backport-libbpf-Adaption-for-sched-type-eBPF-program.patch diff --git a/backport-libbpf-Adaption-for-sched-type-eBPF-program.patch b/backport-libbpf-Adaption-for-sched-type-eBPF-program.patch new file mode 100644 index 0000000..3cb898c --- /dev/null +++ b/backport-libbpf-Adaption-for-sched-type-eBPF-program.patch @@ -0,0 +1,163 @@ +From e3e1bd1e8d6a833f4e1474047d523f1a04298d28 Mon Sep 17 00:00:00 2001 +From: tianmuyang +Date: Wed, 2 Jul 2025 10:07:27 +0800 +Subject: [PATCH] libbpf: Adaption for sched type eBPF program + + In order to run eBPF program hooked at "sched", we need to backport + some code from openEuler-kernel. + Related openEuler-kernel commits: + [0] https://gitee.com/openeuler/kernel/commit/f3422f4a201ef5405d6b6bc7ea2c93686adfca6f + [1] https://gitee.com/openeuler/kernel/commit/95ef108bb84d9de3331b65f840a4e620e01df9fd + +Signed-off-by: tianmuyang +--- + include/uapi/linux/bpf.h | 2 ++ + src/bpf.c | 1 + + src/libbpf.c | 23 ++++++++++++++++++++++- + src/libbpf.h | 2 ++ + src/libbpf.map | 1 + + 5 files changed, 28 insertions(+), 1 deletion(-) + +diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h +index 4b20a72..0bdca9d 100644 +--- a/include/uapi/linux/bpf.h ++++ b/include/uapi/linux/bpf.h +@@ -985,6 +985,7 @@ enum bpf_prog_type { + BPF_PROG_TYPE_EXT, + BPF_PROG_TYPE_LSM, + BPF_PROG_TYPE_SK_LOOKUP, ++ BPF_PROG_TYPE_SCHED, + BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */ + }; + +@@ -1027,6 +1028,7 @@ enum bpf_attach_type { + BPF_XDP_CPUMAP, + BPF_SK_LOOKUP, + BPF_XDP, ++ BPF_SCHED, + BPF_SK_SKB_VERDICT, + BPF_SK_REUSEPORT_SELECT, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, +diff --git a/src/bpf.c b/src/bpf.c +index 128ac72..2a4111c 100644 +--- a/src/bpf.c ++++ b/src/bpf.c +@@ -764,6 +764,7 @@ proceed: + case BPF_TRACE_FENTRY: + case BPF_TRACE_FEXIT: + case BPF_MODIFY_RETURN: ++ case BPF_SCHED: + return bpf_raw_tracepoint_open(NULL, prog_fd); + default: + return libbpf_err(err); +diff --git a/src/libbpf.c b/src/libbpf.c +index 1b95c06..6b236e7 100644 +--- a/src/libbpf.c ++++ b/src/libbpf.c +@@ -117,6 +117,7 @@ static const char * const attach_type_name[] = { + [BPF_PERF_EVENT] = "perf_event", + [BPF_TRACE_KPROBE_MULTI] = "trace_kprobe_multi", + [BPF_STRUCT_OPS] = "struct_ops", ++ [BPF_SCHED] = "sched", + }; + + static const char * const link_type_name[] = { +@@ -130,6 +131,7 @@ static const char * const link_type_name[] = { + [BPF_LINK_TYPE_PERF_EVENT] = "perf_event", + [BPF_LINK_TYPE_KPROBE_MULTI] = "kprobe_multi", + [BPF_LINK_TYPE_STRUCT_OPS] = "struct_ops", ++ [BPF_PROG_TYPE_SCHED] = "sched", + }; + + static const char * const map_type_name[] = { +@@ -2996,7 +2998,8 @@ static int bpf_object_fixup_btf(struct bpf_object *obj) + static bool prog_needs_vmlinux_btf(struct bpf_program *prog) + { + if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || +- prog->type == BPF_PROG_TYPE_LSM) ++ prog->type == BPF_PROG_TYPE_LSM || ++ prog->type == BPF_PROG_TYPE_SCHED) + return true; + + /* BPF_PROG_TYPE_TRACING programs which do not attach to other programs +@@ -8649,6 +8652,7 @@ static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_ + static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link); + static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link); + static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link); ++static int attach_sched(const struct bpf_program *prog, long cookie, struct bpf_link **link); + + static const struct bpf_sec_def section_defs[] = { + SEC_DEF("socket", SOCKET_FILTER, 0, SEC_NONE), +@@ -8733,6 +8737,7 @@ static const struct bpf_sec_def section_defs[] = { + SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE), + SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE), + SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE), ++ SEC_DEF("sched/", SCHED, BPF_SCHED, SEC_ATTACH_BTF, attach_sched), + }; + + int libbpf_register_prog_handler(const char *sec, +@@ -9112,6 +9117,7 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, + #define BTF_TRACE_PREFIX "btf_trace_" + #define BTF_LSM_PREFIX "bpf_lsm_" + #define BTF_ITER_PREFIX "bpf_iter_" ++#define BTF_SCHED_PREFIX "bpf_sched_" + #define BTF_MAX_NAME_SIZE 128 + + void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, +@@ -9131,6 +9137,10 @@ void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + *prefix = BTF_ITER_PREFIX; + *kind = BTF_KIND_FUNC; + break; ++ case BPF_SCHED: ++ *prefix = BTF_SCHED_PREFIX; ++ *kind = BTF_KIND_FUNC; ++ break; + default: + *prefix = ""; + *kind = BTF_KIND_FUNC; +@@ -11710,6 +11720,17 @@ static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_l + return libbpf_get_error(*link); + } + ++struct bpf_link *bpf_program__attach_sched(const struct bpf_program *prog) ++{ ++ return bpf_program__attach_btf_id(prog, NULL); ++} ++ ++static int attach_sched(const struct bpf_program *prog, long cookie, struct bpf_link **link) ++{ ++ *link = bpf_program__attach_sched(prog); ++ return libbpf_get_error(*link); ++} ++ + struct bpf_link *bpf_program__attach(const struct bpf_program *prog) + { + struct bpf_link *link = NULL; +diff --git a/src/libbpf.h b/src/libbpf.h +index 0b73623..ea015bf 100644 +--- a/src/libbpf.h ++++ b/src/libbpf.h +@@ -717,6 +717,8 @@ bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); + LIBBPF_API struct bpf_link * + bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, const char *attach_func_name); ++LIBBPF_API struct bpf_link * ++bpf_program__attach_sched(const struct bpf_program *prog); + + struct bpf_map; + +diff --git a/src/libbpf.map b/src/libbpf.map +index a5aa3a3..5e7ce61 100644 +--- a/src/libbpf.map ++++ b/src/libbpf.map +@@ -236,6 +236,7 @@ LIBBPF_0.2.0 { + perf_buffer__buffer_fd; + perf_buffer__epoll_fd; + perf_buffer__consume_buffer; ++ bpf_program__attach_sched; + } LIBBPF_0.1.0; + + LIBBPF_0.3.0 { +-- +2.33.0 + diff --git a/libbpf.spec b/libbpf.spec index b3adcaf..e32fa2e 100644 --- a/libbpf.spec +++ b/libbpf.spec @@ -4,7 +4,7 @@ Name: %{githubname} Version: %{githubver} -Release: 9 +Release: 10 Summary: Libbpf library License: LGPLv2 or BSD @@ -30,6 +30,7 @@ Patch0013: backport-libbpf-Fixed-getting-wrong-return-address-on-arm64-a.pa Patch0014: backport-libbpf-fix-sym_is_subprog-logic-for-weak-global-subp.patch Patch0015: backport-libbpf-move-global-data-mmap-ing-into-bpf_object__lo.patch Patch0016: backport-libbpf-Use-OPTS_SET-macro-in-bpf_xdp_query.patch +Patch0017: backport-libbpf-Adaption-for-sched-type-eBPF-program.patch # This package supersedes libbpf from kernel-tools, # which has default Epoch: 0. By having Epoch: 1 @@ -82,6 +83,10 @@ developing applications that use %{name} %{_libdir}/libbpf.a %changelog +* Mon Jun 23 2025 tianmuyang 2:1.2.2-10 +- Adaption for sched type eBPF program: + backport-libbpf-Adaption-for-sched-type-eBPF-program.patch + * Fri Mar 14 2025 zhangmingyi 2:1.2.2-9 - backport patch from upstream: backport-libbpf-Use-OPTS_SET-macro-in-bpf_xdp_query.patch -- Gitee