From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753382AbdLHKdt (ORCPT ); Fri, 8 Dec 2017 05:33:49 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:38014 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753354AbdLHKdh (ORCPT ); Fri, 8 Dec 2017 05:33:37 -0500 X-Google-Smtp-Source: AGs4zMZXU4hja1YbW9XwWTdYOaSwNK1B08LsHAxBNoguJiovmJk81aLQdZS98synA9zVUoUFGXpA8g== Subject: Re: [PATCH v2 net-next 1/4] libbpf: add ability to guess program type based on section name To: Roman Gushchin , netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@fb.com, ast@kernel.org, daniel@iogearbox.net, jakub.kicinski@netronome.com, kafai@fb.com, David Ahern References: <20171207183909.16240-1-guro@fb.com> <20171207183909.16240-2-guro@fb.com> From: Quentin Monnet Message-ID: <927054d8-94ea-dbd1-b9f7-213639006969@netronome.com> Date: Fri, 8 Dec 2017 10:33:34 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20171207183909.16240-2-guro@fb.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2017-12-07 18:39 UTC+0000 ~ Roman Gushchin > The bpf_prog_load() function will guess program type if it's not > specified explicitly. This functionality will be used to implement > loading of different programs without asking a user to specify > the program type. In first order it will be used by bpftool. > > Signed-off-by: Roman Gushchin > Cc: Alexei Starovoitov > Cc: Daniel Borkmann > Cc: Jakub Kicinski > Cc: Martin KaFai Lau > Cc: Quentin Monnet > Cc: David Ahern > --- > tools/lib/bpf/libbpf.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 5aa45f89da93..205b7822fa0a 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -1721,6 +1721,45 @@ BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT); > BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); > BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); > > +#define BPF_PROG_SEC(string, type) { string, sizeof(string), type } > +static const struct { > + const char *sec; > + size_t len; > + enum bpf_prog_type prog_type; > +} section_names[] = { > + BPF_PROG_SEC("socket", BPF_PROG_TYPE_SOCKET_FILTER), > + BPF_PROG_SEC("kprobe/", BPF_PROG_TYPE_KPROBE), > + BPF_PROG_SEC("kretprobe/", BPF_PROG_TYPE_KPROBE), > + BPF_PROG_SEC("tracepoint/", BPF_PROG_TYPE_TRACEPOINT), > + BPF_PROG_SEC("xdp", BPF_PROG_TYPE_XDP), > + BPF_PROG_SEC("perf_event", BPF_PROG_TYPE_PERF_EVENT), > + BPF_PROG_SEC("cgroup/skb", BPF_PROG_TYPE_CGROUP_SKB), > + BPF_PROG_SEC("cgroup/sock", BPF_PROG_TYPE_CGROUP_SOCK), > + BPF_PROG_SEC("cgroup/dev", BPF_PROG_TYPE_CGROUP_DEVICE), > + BPF_PROG_SEC("sockops", BPF_PROG_TYPE_SOCK_OPS), > + BPF_PROG_SEC("sk_skb", BPF_PROG_TYPE_SK_SKB), > +}; > +#undef BPF_PROG_SEC > + > +static enum bpf_prog_type bpf_program__guess_type(struct bpf_program *prog) > +{ > + int i; > + > + if (!prog->section_name) > + goto err; > + > + for (i = 0; i < ARRAY_SIZE(section_names); i++) > + if (strncmp(prog->section_name, section_names[i].sec, > + section_names[i].len) == 0) > + return section_names[i].prog_type; > + > +err: > + pr_warning("failed to guess program type based on section name %s\n", > + prog->section_name); > + > + return BPF_PROG_TYPE_UNSPEC; > +} > + > int bpf_map__fd(struct bpf_map *map) > { > return map ? map->fd : -EINVAL; > @@ -1832,6 +1871,18 @@ int bpf_prog_load(const char *file, enum bpf_prog_type type, > return -ENOENT; > } > > + /* > + * If type is not specified, try to guess it based on > + * section name. > + */ > + if (type == BPF_PROG_TYPE_UNSPEC) { > + type = bpf_program__guess_type(prog); > + if (type == BPF_PROG_TYPE_UNSPEC) { > + bpf_object__close(obj); > + return -EINVAL; > + } > + } > + > bpf_program__set_type(prog, type); > err = bpf_object__load(obj); > if (err) { > Looks good to me, nice to avoid the hard-coded string lengths :). Thanks for the changes! Quentin