Commit 91f34aaa authored by Alexei Starovoitov's avatar Alexei Starovoitov
Browse files

Merge branch 'bpf-reject-bpf_timer-for-preempt_rt'

Leon Hwang says:

====================
bpf: Reject bpf_timer for PREEMPT_RT

While running './test_progs -t timer' to validate the test case from
"selftests/bpf: Introduce experimental bpf_in_interrupt()"[0] for
PREEMPT_RT, I encountered a kernel warning:

BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48

To address this, reject bpf_timer usage in the verifier when
PREEMPT_RT is enabled, and skip the corresponding timer selftests.

Changes:
v2 -> v3:
* Drop skipping test case 'timer_interrupt'.
* Address comments from Alexei:
  * Respin targeting bpf tree.
  * Trim commit log.

v1 -> v2:
* Skip test case 'timer_interrupt'.

Links:
[0] https://lore.kernel.org/bpf/20250903140438.59517-1-leon.hwang@linux.dev/
====================

Link: https://patch.msgid.link/20250910125740.52172-1-leon.hwang@linux.dev


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents a3967baa fbdd61c9
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -8547,6 +8547,10 @@ static int process_timer_func(struct bpf_verifier_env *env, int regno,
		verifier_bug(env, "Two map pointers in a timer helper");
		return -EFAULT;
	}
	if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
		verbose(env, "bpf_timer cannot be used for PREEMPT_RT.\n");
		return -EOPNOTSUPP;
	}
	meta->map_uid = reg->map_uid;
	meta->map_ptr = map;
	return 0;
+4 −0
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ void test_free_timer(void)
	int err;

	skel = free_timer__open_and_load();
	if (!skel && errno == EOPNOTSUPP) {
		test__skip();
		return;
	}
	if (!ASSERT_OK_PTR(skel, "open_load"))
		return;

+4 −0
Original line number Diff line number Diff line
@@ -86,6 +86,10 @@ void serial_test_timer(void)
	int err;

	timer_skel = timer__open_and_load();
	if (!timer_skel && errno == EOPNOTSUPP) {
		test__skip();
		return;
	}
	if (!ASSERT_OK_PTR(timer_skel, "timer_skel_load"))
		return;

+4 −0
Original line number Diff line number Diff line
@@ -12,6 +12,10 @@ static void test_timer_crash_mode(int mode)
	struct timer_crash *skel;

	skel = timer_crash__open_and_load();
	if (!skel && errno == EOPNOTSUPP) {
		test__skip();
		return;
	}
	if (!ASSERT_OK_PTR(skel, "timer_crash__open_and_load"))
		return;
	skel->bss->pid = getpid();
+4 −0
Original line number Diff line number Diff line
@@ -59,6 +59,10 @@ void test_timer_lockup(void)
	}

	skel = timer_lockup__open_and_load();
	if (!skel && errno == EOPNOTSUPP) {
		test__skip();
		return;
	}
	if (!ASSERT_OK_PTR(skel, "timer_lockup__open_and_load"))
		return;

Loading