Hi, On 8/3/2024 8:11 AM, Amery Hung wrote: > From: Dave Marchevsky <davemarchevsky@xxxxxx> > > Test stashing a referenced kptr in to a local kptr. > > Acked-by: Martin KaFai Lau <martin.lau@xxxxxxxxxx> > Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx> > Signed-off-by: Amery Hung <amery.hung@xxxxxxxxxxxxx> > --- > .../selftests/bpf/progs/local_kptr_stash.c | 22 +++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/bpf/progs/local_kptr_stash.c b/tools/testing/selftests/bpf/progs/local_kptr_stash.c > index 75043ffc5dad..a0d784e8a05b 100644 > --- a/tools/testing/selftests/bpf/progs/local_kptr_stash.c > +++ b/tools/testing/selftests/bpf/progs/local_kptr_stash.c > @@ -11,6 +11,7 @@ > struct node_data { > long key; > long data; > + struct prog_test_ref_kfunc __kptr *stashed_in_node; > struct bpf_rb_node node; > }; Because prog_test_ref_kfunc is a module btf, so the btf_get() in btf_parse_kptr() will not be invoked. I would like to suggest to add a user-defined type kptr in node_data to exercise the btf_get() in btf_parse_kptr(). > > @@ -85,18 +86,35 @@ static bool less(struct bpf_rb_node *a, const struct bpf_rb_node *b) > > static int create_and_stash(int idx, int val) > { > + struct prog_test_ref_kfunc *inner; > struct map_value *mapval; > struct node_data *res; > + unsigned long dummy; > > mapval = bpf_map_lookup_elem(&some_nodes, &idx); > if (!mapval) > return 1; > > + dummy = 0; > + inner = bpf_kfunc_call_test_acquire(&dummy); > + if (!inner) > + return 2; > + > res = bpf_obj_new(typeof(*res)); > - if (!res) > - return 1; > + if (!res) { > + bpf_kfunc_call_test_release(inner); > + return 3; > + } > res->key = val; > > + inner = bpf_kptr_xchg(&res->stashed_in_node, inner); > + if (inner) { > + /* Should never happen, we just obj_new'd res */ > + bpf_kfunc_call_test_release(inner); > + bpf_obj_drop(res); > + return 4; > + } > + > res = bpf_kptr_xchg(&mapval->node, res); > if (res) > bpf_obj_drop(res);