mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 23:52:08 +02:00
selftests: bpf: Add tests for unbalanced rcu_read_lock
As verifier now supports nested rcu critical sections, add new test cases to make sure unbalanced usage of rcu_read_lock()/unlock() is rejected. Signed-off-by: Puranjay Mohan <puranjay@kernel.org> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://lore.kernel.org/r/20251117200411.25563-3-puranjay@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
4167096cb9
commit
cf49ec5705
|
|
@ -79,6 +79,8 @@ static const char * const inproper_region_tests[] = {
|
|||
"non_sleepable_rcu_mismatch",
|
||||
"inproper_sleepable_helper",
|
||||
"inproper_sleepable_kfunc",
|
||||
"nested_rcu_region_unbalanced_1",
|
||||
"nested_rcu_region_unbalanced_2",
|
||||
"rcu_read_lock_global_subprog_lock",
|
||||
"rcu_read_lock_global_subprog_unlock",
|
||||
"rcu_read_lock_sleepable_helper_global_subprog",
|
||||
|
|
|
|||
|
|
@ -278,6 +278,46 @@ int nested_rcu_region(void *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SEC("?fentry.s/" SYS_PREFIX "sys_nanosleep")
|
||||
int nested_rcu_region_unbalanced_1(void *ctx)
|
||||
{
|
||||
struct task_struct *task, *real_parent;
|
||||
|
||||
/* nested rcu read lock regions */
|
||||
task = bpf_get_current_task_btf();
|
||||
bpf_rcu_read_lock();
|
||||
bpf_rcu_read_lock();
|
||||
real_parent = task->real_parent;
|
||||
if (!real_parent)
|
||||
goto out;
|
||||
(void)bpf_task_storage_get(&map_a, real_parent, 0, 0);
|
||||
out:
|
||||
bpf_rcu_read_unlock();
|
||||
bpf_rcu_read_unlock();
|
||||
bpf_rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?fentry.s/" SYS_PREFIX "sys_nanosleep")
|
||||
int nested_rcu_region_unbalanced_2(void *ctx)
|
||||
{
|
||||
struct task_struct *task, *real_parent;
|
||||
|
||||
/* nested rcu read lock regions */
|
||||
task = bpf_get_current_task_btf();
|
||||
bpf_rcu_read_lock();
|
||||
bpf_rcu_read_lock();
|
||||
bpf_rcu_read_lock();
|
||||
real_parent = task->real_parent;
|
||||
if (!real_parent)
|
||||
goto out;
|
||||
(void)bpf_task_storage_get(&map_a, real_parent, 0, 0);
|
||||
out:
|
||||
bpf_rcu_read_unlock();
|
||||
bpf_rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
|
||||
int task_trusted_non_rcuptr(void *ctx)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user