A test kfunc named bpf_kfunc_multi_st_ops_test_1_impl() is a user of
__prog suffix. Subsequent patch removes __prog support in favor of
KF_IMPLICIT_ARGS, so migrate this kfunc to use implicit argument.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
tools/testing/selftests/bpf/progs/struct_ops_assoc.c | 8 ++++----
.../selftests/bpf/progs/struct_ops_assoc_in_timer.c | 4 ++--
.../testing/selftests/bpf/progs/struct_ops_assoc_reuse.c | 6 +++---
tools/testing/selftests/bpf/test_kmods/bpf_testmod.c | 9 ++++-----
.../testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h | 6 ++++--
5 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/struct_ops_assoc.c b/tools/testing/selftests/bpf/progs/struct_ops_assoc.c
index 8f1097903e22..68842e3f936b 100644
--- a/tools/testing/selftests/bpf/progs/struct_ops_assoc.c
+++ b/tools/testing/selftests/bpf/progs/struct_ops_assoc.c
@@ -32,7 +32,7 @@ int BPF_PROG(sys_enter_prog_a, struct pt_regs *regs, long id)
if (!test_pid || task->pid != test_pid)
return 0;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_A_MAGIC)
test_err_a++;
@@ -45,7 +45,7 @@ int syscall_prog_a(void *ctx)
struct st_ops_args args = {};
int ret;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_A_MAGIC)
test_err_a++;
@@ -79,7 +79,7 @@ int BPF_PROG(sys_enter_prog_b, struct pt_regs *regs, long id)
if (!test_pid || task->pid != test_pid)
return 0;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_B_MAGIC)
test_err_b++;
@@ -92,7 +92,7 @@ int syscall_prog_b(void *ctx)
struct st_ops_args args = {};
int ret;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_B_MAGIC)
test_err_b++;
diff --git a/tools/testing/selftests/bpf/progs/struct_ops_assoc_in_timer.c b/tools/testing/selftests/bpf/progs/struct_ops_assoc_in_timer.c
index d5a2ea934284..0bed49e9f217 100644
--- a/tools/testing/selftests/bpf/progs/struct_ops_assoc_in_timer.c
+++ b/tools/testing/selftests/bpf/progs/struct_ops_assoc_in_timer.c
@@ -31,7 +31,7 @@ __noinline static int timer_cb(void *map, int *key, struct bpf_timer *timer)
struct st_ops_args args = {};
recur++;
- timer_test_1_ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ timer_test_1_ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
recur--;
timer_cb_run++;
@@ -64,7 +64,7 @@ int syscall_prog(void *ctx)
struct st_ops_args args = {};
int ret;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_MAGIC)
test_err++;
diff --git a/tools/testing/selftests/bpf/progs/struct_ops_assoc_reuse.c b/tools/testing/selftests/bpf/progs/struct_ops_assoc_reuse.c
index 5bb6ebf5eed4..396b3e58c729 100644
--- a/tools/testing/selftests/bpf/progs/struct_ops_assoc_reuse.c
+++ b/tools/testing/selftests/bpf/progs/struct_ops_assoc_reuse.c
@@ -23,7 +23,7 @@ int BPF_PROG(test_1_a, struct st_ops_args *args)
if (!recur) {
recur++;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(args);
if (ret != -1)
test_err_a++;
recur--;
@@ -40,7 +40,7 @@ int syscall_prog_a(void *ctx)
struct st_ops_args args = {};
int ret;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_A_MAGIC)
test_err_a++;
@@ -62,7 +62,7 @@ int syscall_prog_b(void *ctx)
struct st_ops_args args = {};
int ret;
- ret = bpf_kfunc_multi_st_ops_test_1_impl(&args, NULL);
+ ret = bpf_kfunc_multi_st_ops_test_1_assoc(&args);
if (ret != MAP_A_MAGIC)
test_err_b++;
diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
index a996b816ecc4..0d542ba64365 100644
--- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
+++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod.c
@@ -1140,7 +1140,7 @@ __bpf_kfunc int bpf_kfunc_st_ops_inc10(struct st_ops_args *args)
}
__bpf_kfunc int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id);
-__bpf_kfunc int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux_prog);
+__bpf_kfunc int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args, struct bpf_prog_aux *aux);
__bpf_kfunc int bpf_kfunc_implicit_arg(int a, struct bpf_prog_aux *aux);
__bpf_kfunc int bpf_kfunc_implicit_arg_legacy(int a, int b, struct bpf_prog_aux *aux);
@@ -1187,7 +1187,7 @@ BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_epilogue, KF_SLEEPABLE)
BTF_ID_FLAGS(func, bpf_kfunc_st_ops_test_pro_epilogue, KF_SLEEPABLE)
BTF_ID_FLAGS(func, bpf_kfunc_st_ops_inc10)
BTF_ID_FLAGS(func, bpf_kfunc_multi_st_ops_test_1)
-BTF_ID_FLAGS(func, bpf_kfunc_multi_st_ops_test_1_impl)
+BTF_ID_FLAGS(func, bpf_kfunc_multi_st_ops_test_1_assoc, KF_IMPLICIT_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_implicit_arg, KF_IMPLICIT_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_implicit_arg_legacy, KF_IMPLICIT_ARGS)
BTF_ID_FLAGS(func, bpf_kfunc_implicit_arg_legacy_impl)
@@ -1669,13 +1669,12 @@ int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id)
}
/* Call test_1() of the associated struct_ops map */
-int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux__prog)
+int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args, struct bpf_prog_aux *aux)
{
- struct bpf_prog_aux *prog_aux = (struct bpf_prog_aux *)aux__prog;
struct bpf_testmod_multi_st_ops *st_ops;
int ret = -1;
- st_ops = (struct bpf_testmod_multi_st_ops *)bpf_prog_get_assoc_struct_ops(prog_aux);
+ st_ops = (struct bpf_testmod_multi_st_ops *)bpf_prog_get_assoc_struct_ops(aux);
if (st_ops)
ret = st_ops->test_1(args);
diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
index 2357a0340ffe..225ea30c4e3d 100644
--- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
+++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h
@@ -161,7 +161,9 @@ 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;
-int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux__prog) __ksym;
+#ifndef __KERNEL__
+extern int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id) __weak __ksym;
+extern int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args) __weak __ksym;
+#endif
#endif /* _BPF_TESTMOD_KFUNC_H */
--
2.52.0
On Fri, 2026-01-16 at 12:16 -0800, Ihor Solodrai wrote: [...] > diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > index 2357a0340ffe..225ea30c4e3d 100644 > --- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > +++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > @@ -161,7 +161,9 @@ 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; > -int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux__prog) __ksym; > +#ifndef __KERNEL__ > +extern int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id) __weak __ksym; > +extern int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args) __weak __ksym; > +#endif Nit: wbpf_kfunc_multi_st_ops_test_1 change is not necessary, right?
On 1/19/26 5:59 PM, Eduard Zingerman wrote: > On Fri, 2026-01-16 at 12:16 -0800, Ihor Solodrai wrote: > > [...] > >> diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h >> index 2357a0340ffe..225ea30c4e3d 100644 >> --- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h >> +++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h >> @@ -161,7 +161,9 @@ 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; >> -int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux__prog) __ksym; >> +#ifndef __KERNEL__ >> +extern int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id) __weak __ksym; >> +extern int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args) __weak __ksym; >> +#endif > > Nit: wbpf_kfunc_multi_st_ops_test_1 change is not necessary, right? Right, but it felt wrong to only change one of these decls. This header is weird in that it is included both in the module code and in BPF progs, although it is typically not a problem since the most kfunc signatures match. Maybe it should have #ifndef __KERNEL__ followed by kfunc declarations that correspond to vmlinux.h format? I haven't tried that, but seems logical to me.
On Tue, 2026-01-20 at 10:20 -0800, Ihor Solodrai wrote: > On 1/19/26 5:59 PM, Eduard Zingerman wrote: > > On Fri, 2026-01-16 at 12:16 -0800, Ihor Solodrai wrote: > > > > [...] > > > > > diff --git a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > > > index 2357a0340ffe..225ea30c4e3d 100644 > > > --- a/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > > > +++ b/tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h > > > @@ -161,7 +161,9 @@ 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; > > > -int bpf_kfunc_multi_st_ops_test_1_impl(struct st_ops_args *args, void *aux__prog) __ksym; > > > +#ifndef __KERNEL__ > > > +extern int bpf_kfunc_multi_st_ops_test_1(struct st_ops_args *args, u32 id) __weak __ksym; > > > +extern int bpf_kfunc_multi_st_ops_test_1_assoc(struct st_ops_args *args) __weak __ksym; > > > +#endif > > > > Nit: wbpf_kfunc_multi_st_ops_test_1 change is not necessary, right? > > Right, but it felt wrong to only change one of these decls. > > This header is weird in that it is included both in the module code > and in BPF progs, although it is typically not a problem since the > most kfunc signatures match. I think it is used this way, so that compiler can warn user about signature mismatch during development. > Maybe it should have #ifndef __KERNEL__ followed by kfunc declarations > that correspond to vmlinux.h format? I haven't tried that, but seems > logical to me.
© 2016 - 2026 Red Hat, Inc.