Message ID | 20220806074019.2756957-5-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), sock_map_iter_attach_target() has already > acquired a map uref, but the uref may be released by bpf_link_release() > during th reading of map iterator. > > Fixing it by acquiring an extra map uref in .init_seq_private and > releasing it in .fini_seq_private. > > Fixes: 0365351524d7 ("net: Allow iterating sockmap and sockhash") > 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/sock_map.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/net/core/sock_map.c b/net/core/sock_map.c > index 028813dfecb0..9a9fb9487d63 100644 > --- a/net/core/sock_map.c > +++ b/net/core/sock_map.c > @@ -783,13 +783,22 @@ static int sock_map_init_seq_private(void *priv_data, > { > struct sock_map_seq_info *info = priv_data; > > + bpf_map_inc_with_uref(aux->map); > info->map = aux->map; > return 0; > } > > +static void sock_map_fini_seq_private(void *priv_data) > +{ > + struct sock_map_seq_info *info = priv_data; > + > + bpf_map_put_with_uref(info->map); > +} > + > static const struct bpf_iter_seq_info sock_map_iter_seq_info = { > .seq_ops = &sock_map_seq_ops, > .init_seq_private = sock_map_init_seq_private, > + .fini_seq_private = sock_map_fini_seq_private, > .seq_priv_size = sizeof(struct sock_map_seq_info), > }; > > @@ -1369,18 +1378,27 @@ static const struct seq_operations sock_hash_seq_ops = { > }; > > static int sock_hash_init_seq_private(void *priv_data, > - struct bpf_iter_aux_info *aux) > + struct bpf_iter_aux_info *aux) > { > struct sock_hash_seq_info *info = priv_data; > > + bpf_map_inc_with_uref(aux->map); > info->map = aux->map; > info->htab = container_of(aux->map, struct bpf_shtab, map); > return 0; > } > > +static void sock_hash_fini_seq_private(void *priv_data) > +{ > + struct sock_hash_seq_info *info = priv_data; > + > + bpf_map_put_with_uref(info->map); > +} > + > static const struct bpf_iter_seq_info sock_hash_iter_seq_info = { > .seq_ops = &sock_hash_seq_ops, > .init_seq_private = sock_hash_init_seq_private, > + .fini_seq_private = sock_hash_fini_seq_private, > .seq_priv_size = sizeof(struct sock_hash_seq_info), > }; >
diff --git a/net/core/sock_map.c b/net/core/sock_map.c index 028813dfecb0..9a9fb9487d63 100644 --- a/net/core/sock_map.c +++ b/net/core/sock_map.c @@ -783,13 +783,22 @@ static int sock_map_init_seq_private(void *priv_data, { struct sock_map_seq_info *info = priv_data; + bpf_map_inc_with_uref(aux->map); info->map = aux->map; return 0; } +static void sock_map_fini_seq_private(void *priv_data) +{ + struct sock_map_seq_info *info = priv_data; + + bpf_map_put_with_uref(info->map); +} + static const struct bpf_iter_seq_info sock_map_iter_seq_info = { .seq_ops = &sock_map_seq_ops, .init_seq_private = sock_map_init_seq_private, + .fini_seq_private = sock_map_fini_seq_private, .seq_priv_size = sizeof(struct sock_map_seq_info), }; @@ -1369,18 +1378,27 @@ static const struct seq_operations sock_hash_seq_ops = { }; static int sock_hash_init_seq_private(void *priv_data, - struct bpf_iter_aux_info *aux) + struct bpf_iter_aux_info *aux) { struct sock_hash_seq_info *info = priv_data; + bpf_map_inc_with_uref(aux->map); info->map = aux->map; info->htab = container_of(aux->map, struct bpf_shtab, map); return 0; } +static void sock_hash_fini_seq_private(void *priv_data) +{ + struct sock_hash_seq_info *info = priv_data; + + bpf_map_put_with_uref(info->map); +} + static const struct bpf_iter_seq_info sock_hash_iter_seq_info = { .seq_ops = &sock_hash_seq_ops, .init_seq_private = sock_hash_init_seq_private, + .fini_seq_private = sock_hash_fini_seq_private, .seq_priv_size = sizeof(struct sock_hash_seq_info), };