Message ID | 20220810080538.1845898-4-houtao@huaweicloud.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 3c5f6e698b5c538bbb23cd453b22e1e4922cffd8 |
Delegated to: | BPF |
Headers | show |
Series | fixes for bpf map iterator | expand |
On Wed, Aug 10, 2022 at 04:05:32PM +0800, Hou Tao wrote: > From: Hou Tao <houtao1@huawei.com> > > bpf_iter_attach_map() acquires a map uref, and the uref may be released > before or in the middle of iterating map elements. For example, the uref > could be released in bpf_iter_detach_map() as part of > bpf_link_release(), or could be released in bpf_map_put_with_uref() as > part of bpf_map_release(). > > So acquiring an extra map uref in bpf_iter_init_sk_storage_map() and > releasing it in bpf_iter_fini_sk_storage_map(). Acked-by: Martin KaFai Lau <kafai@fb.com>
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), };