Message ID | 20220806074019.2756957-4-houtao@huaweicloud.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | fixes for bpf map iterator | expand |
On 8/6/22 12:40 AM, Hou Tao wrote: > From: Hou Tao <houtao1@huawei.com> > > During bpf(BPF_LINK_CREATE) for BPF_TRACE_ITER, bpf_iter_attach_map() > has already acquired a map uref, but the uref may be released > by bpf_link_release() during th reading of map iterator. > > So acquiring an extra map uref in bpf_iter_init_sk_storage_map() and > releasing it in bpf_iter_fini_sk_storage_map(). > > Fixes: 5ce6e77c7edf ("bpf: Implement bpf iterator for sock local storage map") > Signed-off-by: Hou Tao <houtao1@huawei.com> See my previous reply for some wording issue. Acked-by: Yonghong Song <yhs@fb.com> > --- > net/core/bpf_sk_storage.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/net/core/bpf_sk_storage.c b/net/core/bpf_sk_storage.c > index a25ec93729b9..83b89ba824d7 100644 > --- a/net/core/bpf_sk_storage.c > +++ b/net/core/bpf_sk_storage.c > @@ -875,10 +875,18 @@ static int bpf_iter_init_sk_storage_map(void *priv_data, > { > struct bpf_iter_seq_sk_storage_map_info *seq_info = priv_data; > > + bpf_map_inc_with_uref(aux->map); > seq_info->map = aux->map; > return 0; > } > > +static void bpf_iter_fini_sk_storage_map(void *priv_data) > +{ > + struct bpf_iter_seq_sk_storage_map_info *seq_info = priv_data; > + > + bpf_map_put_with_uref(seq_info->map); > +} > + > static int bpf_iter_attach_map(struct bpf_prog *prog, > union bpf_iter_link_info *linfo, > struct bpf_iter_aux_info *aux) > @@ -924,7 +932,7 @@ static const struct seq_operations bpf_sk_storage_map_seq_ops = { > static const struct bpf_iter_seq_info iter_seq_info = { > .seq_ops = &bpf_sk_storage_map_seq_ops, > .init_seq_private = bpf_iter_init_sk_storage_map, > - .fini_seq_private = NULL, > + .fini_seq_private = bpf_iter_fini_sk_storage_map, > .seq_priv_size = sizeof(struct bpf_iter_seq_sk_storage_map_info), > }; >
diff --git a/net/core/bpf_sk_storage.c b/net/core/bpf_sk_storage.c index a25ec93729b9..83b89ba824d7 100644 --- a/net/core/bpf_sk_storage.c +++ b/net/core/bpf_sk_storage.c @@ -875,10 +875,18 @@ static int bpf_iter_init_sk_storage_map(void *priv_data, { struct bpf_iter_seq_sk_storage_map_info *seq_info = priv_data; + bpf_map_inc_with_uref(aux->map); seq_info->map = aux->map; return 0; } +static void bpf_iter_fini_sk_storage_map(void *priv_data) +{ + struct bpf_iter_seq_sk_storage_map_info *seq_info = priv_data; + + bpf_map_put_with_uref(seq_info->map); +} + static int bpf_iter_attach_map(struct bpf_prog *prog, union bpf_iter_link_info *linfo, struct bpf_iter_aux_info *aux) @@ -924,7 +932,7 @@ static const struct seq_operations bpf_sk_storage_map_seq_ops = { static const struct bpf_iter_seq_info iter_seq_info = { .seq_ops = &bpf_sk_storage_map_seq_ops, .init_seq_private = bpf_iter_init_sk_storage_map, - .fini_seq_private = NULL, + .fini_seq_private = bpf_iter_fini_sk_storage_map, .seq_priv_size = sizeof(struct bpf_iter_seq_sk_storage_map_info), };