Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing/ftrace: Add might_fault check to syscall probes

Add a might_fault() check to validate that the ftrace sys_enter/sys_exit
probe callbacks are indeed called from a context where page faults can
be handled.

Cc: Michael Jeanson <mjeanson@efficios.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Yonghong Song <yhs@fb.com>
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: bpf@vger.kernel.org
Cc: Joel Fernandes <joel@joelfernandes.org>
Link: https://lore.kernel.org/20241009010718.2050182-7-mathieu.desnoyers@efficios.com
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

authored by

Mathieu Desnoyers and committed by
Steven Rostedt (Google)
a3204c74 a363d27c

+3
+1
include/trace/trace_events.h
··· 446 446 static notrace void \ 447 447 trace_event_raw_event_##call(void *__data, proto) \ 448 448 { \ 449 + might_fault(); \ 449 450 preempt_disable_notrace(); \ 450 451 do_trace_event_raw_event_##call(__data, args); \ 451 452 preempt_enable_notrace(); \
+2
kernel/trace/trace_syscalls.c
··· 303 303 * Syscall probe called with preemption enabled, but the ring 304 304 * buffer and per-cpu data require preemption to be disabled. 305 305 */ 306 + might_fault(); 306 307 guard(preempt_notrace)(); 307 308 308 309 syscall_nr = trace_get_syscall_nr(current, regs); ··· 349 348 * Syscall probe called with preemption enabled, but the ring 350 349 * buffer and per-cpu data require preemption to be disabled. 351 350 */ 351 + might_fault(); 352 352 guard(preempt_notrace)(); 353 353 354 354 syscall_nr = trace_get_syscall_nr(current, regs);