On Sat, Apr 6, 2024 at 9:04 AM Yonghong Song <yonghong.song@xxxxxxxxx> wrote: > > Add bpf_link support for sk_msg and sk_skb programs. We have an > internal request to support bpf_link for sk_msg programs so user > space can have a uniform handling with bpf_link based libbpf > APIs. Using bpf_link based libbpf API also has a benefit which > makes system robust by decoupling prog life cycle and > attachment life cycle. > > Reviewed-by: John Fastabend <john.fastabend@xxxxxxxxx> > Signed-off-by: Yonghong Song <yonghong.song@xxxxxxxxx> > --- > include/linux/bpf.h | 6 + > include/linux/skmsg.h | 4 + > include/uapi/linux/bpf.h | 5 + > kernel/bpf/syscall.c | 4 + > net/core/sock_map.c | 270 ++++++++++++++++++++++++++++++--- > tools/include/uapi/linux/bpf.h | 5 + > 6 files changed, 277 insertions(+), 17 deletions(-) > Please check bpf_prog_attach_check_attach_type(), it probably should be updated as well. Other than that looks good. [...] > static int sock_map_prog_update(struct bpf_map *map, struct bpf_prog *prog, > - struct bpf_prog *old, u32 which) > + struct bpf_prog *old, struct bpf_link *link, > + u32 which) > { > struct bpf_prog **pprog; > + struct bpf_link **plink; > int ret; > > - ret = sock_map_prog_lookup(map, &pprog, which); > + ret = sock_map_prog_link_lookup(map, &pprog, &plink, NULL, link && !prog, which); > if (ret) > - return ret; > + goto out; probably could have kept `return ret;` here? > > - if (old) > - return psock_replace_prog(pprog, prog, old); > + if (old) { > + ret = psock_replace_prog(pprog, prog, old); > + if (!ret) > + *plink = NULL; > + } else { > + psock_set_prog(pprog, prog); > + if (link) > + *plink = link; > + } > > - psock_set_prog(pprog, prog); > - return 0; > +out: and wouldn't need out: then > + return ret; > } > [...]