[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.