Commit 8b788d66 authored by Kumar Kartikeya Dwivedi's avatar Kumar Kartikeya Dwivedi Committed by Alexei Starovoitov
Browse files

selftests/bpf: Add tests for KF_RCU_PROTECTED



Add a couple of test cases to ensure RCU protection is kicked in
automatically, and the return type is as expected.

Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250917032755.4068726-3-memxor@gmail.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 1512231b
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -123,3 +123,49 @@ int iter_next_ptr_mem_not_trusted(const void *ctx)
	bpf_iter_num_destroy(&num_it);
	return 0;
}

SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
__failure __msg("kernel func bpf_kfunc_ret_rcu_test requires RCU critical section protection")
int iter_ret_rcu_test_protected(const void *ctx)
{
	struct task_struct *p;

	p = bpf_kfunc_ret_rcu_test();
	return p->pid;
}

SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
__failure __msg("R1 type=rcu_ptr_or_null_ expected=")
int iter_ret_rcu_test_type(const void *ctx)
{
	struct task_struct *p;

	bpf_rcu_read_lock();
	p = bpf_kfunc_ret_rcu_test();
	bpf_this_cpu_ptr(p);
	bpf_rcu_read_unlock();
	return 0;
}

SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
__failure __msg("kernel func bpf_kfunc_ret_rcu_test_nostruct requires RCU critical section protection")
int iter_ret_rcu_test_protected_nostruct(const void *ctx)
{
	void *p;

	p = bpf_kfunc_ret_rcu_test_nostruct(4);
	return *(int *)p;
}

SEC("?fentry.s/" SYS_PREFIX "sys_getpgid")
__failure __msg("R1 type=rdonly_rcu_mem_or_null expected=")
int iter_ret_rcu_test_type_nostruct(const void *ctx)
{
	void *p;

	bpf_rcu_read_lock();
	p = bpf_kfunc_ret_rcu_test_nostruct(4);
	bpf_this_cpu_ptr(p);
	bpf_rcu_read_unlock();
	return 0;
}
+12 −0
Original line number Diff line number Diff line
@@ -218,6 +218,16 @@ __bpf_kfunc void bpf_kfunc_rcu_task_test(struct task_struct *ptr)
{
}

__bpf_kfunc struct task_struct *bpf_kfunc_ret_rcu_test(void)
{
	return NULL;
}

__bpf_kfunc int *bpf_kfunc_ret_rcu_test_nostruct(int rdonly_buf_size)
{
	return NULL;
}

__bpf_kfunc struct bpf_testmod_ctx *
bpf_testmod_ctx_create(int *err)
{
@@ -623,6 +633,8 @@ BTF_ID_FLAGS(func, bpf_kfunc_trusted_vma_test, KF_TRUSTED_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_trusted_task_test, KF_TRUSTED_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_trusted_num_test, KF_TRUSTED_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_rcu_task_test, KF_RCU)
BTF_ID_FLAGS(func, bpf_kfunc_ret_rcu_test, KF_RET_NULL | KF_RCU_PROTECTED)
BTF_ID_FLAGS(func, bpf_kfunc_ret_rcu_test_nostruct, KF_RET_NULL | KF_RCU_PROTECTED)
BTF_ID_FLAGS(func, bpf_testmod_ctx_create, KF_ACQUIRE | KF_RET_NULL)
BTF_ID_FLAGS(func, bpf_testmod_ctx_release, KF_RELEASE)
BTF_ID_FLAGS(func, bpf_testmod_ops3_call_test_1)
+2 −0
Original line number Diff line number Diff line
@@ -158,6 +158,8 @@ void bpf_kfunc_trusted_vma_test(struct vm_area_struct *ptr) __ksym;
void bpf_kfunc_trusted_task_test(struct task_struct *ptr) __ksym;
void bpf_kfunc_trusted_num_test(int *ptr) __ksym;
void bpf_kfunc_rcu_task_test(struct task_struct *ptr) __ksym;
struct task_struct *bpf_kfunc_ret_rcu_test(void) __ksym;
int *bpf_kfunc_ret_rcu_test_nostruct(int rdonly_buf_size) __ksym;

int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id) __ksym;