[PATCH sched_ext/for-7.4] tools/sched_ext: Skip scx_lib_init_probe() without CONFIG_FUNCTION_TRACER
Cheng-Yang Chou <[email protected]>
| Newsgroups | dev.linux.lists.sched-ext |
|---|---|
| Message-ID | <[email protected]> |
scx_lib_init_probe() is a fentry probe auto-attached by every scheduler via SCX_OPS_LOAD()/SCX_OPS_ATTACH(). Without CONFIG_FUNCTION_TRACER it can't attach, and skel__attach()'s all-or-nothing semantics takes the whole scheduler down. Skip its autoload when /proc/sys/kernel/ftrace_enabled is absent, and skip disabled programs in the post-load struct_ops association loop so it doesn't try to associate a program with no FD. Reproduced and fixed in vng with a CONFIG_FUNCTION_TRACER=n kernel. Syncs the fix from https://github.com/sched-ext/scx/pull/3758. As discussed in GitHub, once we stop supporting pre-6.18 kernels, this workaround can be removed. Signed-off-by: Cheng-Yang Chou <[email protected]> --- tools/sched_ext/include/scx/compat.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tools/sched_ext/include/scx/compat.h b/tools/sched_ext/include/scx/compat.h index 7c12df45fdba..faf608cbed55 100644 --- a/tools/sched_ext/include/scx/compat.h +++ b/tools/sched_ext/include/scx/compat.h @@ -361,13 +361,27 @@ static inline void __scx_ops_assoc_prog(struct bpf_program *prog, } #endif +/* + * Whether the kernel supports function tracing (CONFIG_FUNCTION_TRACER), + * needed for fentry/fexit BPF programs to load or attach. + * /proc/sys/kernel/ftrace_enabled only exists when it's compiled in, so its + * presence is a cheap proxy. + */ +static inline bool __COMPAT_function_tracer_available(void) +{ + return access("/proc/sys/kernel/ftrace_enabled", F_OK) == 0; +} + /* See SCX_OPS_OPEN() above for backward-compatibility handling. */ #define SCX_OPS_LOAD(__skel, __ops_name, __scx_name, __uei_name) ({ \ struct bpf_program *__prog; \ UEI_SET_SIZE(__skel, __ops_name, __uei_name); \ + if (!__COMPAT_function_tracer_available()) \ + bpf_program__set_autoload((__skel)->progs.scx_lib_init_probe, false); \ SCX_BUG_ON(__scx_name##__load((__skel)), "Failed to load skel"); \ bpf_object__for_each_program(__prog, (__skel)->obj) { \ - if (bpf_program__type(__prog) == BPF_PROG_TYPE_STRUCT_OPS) \ + if (bpf_program__type(__prog) == BPF_PROG_TYPE_STRUCT_OPS || \ + !bpf_program__autoload(__prog)) \ continue; \ __scx_ops_assoc_prog(__prog, (__skel)->maps.__ops_name, \ #__ops_name); \ -- 2.43.0