From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Ignatov Subject: Re: [PATCH bpf-next v3 05/13] tools: libbpf: expose the prog type guessing from section name logic Date: Tue, 10 Jul 2018 20:01:55 -0700 Message-ID: <20180711030154.GA52033@rdna-mbp> References: <20180710214307.4834-1-jakub.kicinski@netronome.com> <20180710214307.4834-6-jakub.kicinski@netronome.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Cc: , , , To: Jakub Kicinski Return-path: Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:34070 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732292AbeGKDEw (ORCPT ); Tue, 10 Jul 2018 23:04:52 -0400 Content-Disposition: inline In-Reply-To: <20180710214307.4834-6-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: Jakub Kicinski [Tue, 2018-07-10 14:43 -0700]: > libbpf can guess program type based on ELF section names. As libbpf > becomes more popular its association between section name strings and > types becomes more of a standard. Allow libbpf users to use the same > logic for matching strings to types, e.g. when the string originates > from command line. > > Signed-off-by: Jakub Kicinski > Reviewed-by: Quentin Monnet > --- > v3 (Andrey): > - use -EINVAL error code; > - rename helper to libbpf_prog_type_by_name(). > --- > tools/lib/bpf/libbpf.c | 43 ++++++++++++++++++++++++------------------ > tools/lib/bpf/libbpf.h | 3 +++ > 2 files changed, 28 insertions(+), 18 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 38ed3e92e393..42f31eff5f3f 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -2081,23 +2081,31 @@ static const struct { > #undef BPF_S_PROG_SEC > #undef BPF_SA_PROG_SEC > > -static int bpf_program__identify_section(struct bpf_program *prog) > +int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, > + enum bpf_attach_type *expected_attach_type) > { > 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 i; > + if (!name) > + return -EINVAL; > > -err: > - pr_warning("failed to guess program type based on section name %s\n", > - prog->section_name); > + for (i = 0; i < ARRAY_SIZE(section_names); i++) { > + if (strncmp(name, section_names[i].sec, section_names[i].len)) > + continue; > + *prog_type = section_names[i].prog_type; > + *expected_attach_type = section_names[i].expected_attach_type; > + return 0; > + } > + return -EINVAL; > +} > > - return -1; > +static int > +bpf_program__identify_section(struct bpf_program *prog, > + enum bpf_prog_type *prog_type, > + enum bpf_attach_type *expected_attach_type) > +{ > + return libbpf_prog_type_by_name(prog->section_name, prog_type, > + expected_attach_type); > } > > int bpf_map__fd(struct bpf_map *map) > @@ -2230,7 +2238,6 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, > enum bpf_prog_type prog_type; > struct bpf_object *obj; > struct bpf_map *map; > - int section_idx; > int err; > > if (!attr) > @@ -2252,14 +2259,14 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, > prog->prog_ifindex = attr->ifindex; > expected_attach_type = attr->expected_attach_type; > if (prog_type == BPF_PROG_TYPE_UNSPEC) { > - section_idx = bpf_program__identify_section(prog); > - if (section_idx < 0) { > + err = bpf_program__identify_section(prog, &prog_type, > + &expected_attach_type); > + if (err < 0) { > + pr_warning("failed to guess program type based on section name %s\n", > + prog->section_name); > bpf_object__close(obj); > return -EINVAL; > } > - prog_type = section_names[section_idx].prog_type; > - expected_attach_type = > - section_names[section_idx].expected_attach_type; > } > > bpf_program__set_type(prog, prog_type); > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index 564f4be9bae0..d1ce5c828e2e 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -92,6 +92,9 @@ int bpf_object__set_priv(struct bpf_object *obj, void *priv, > bpf_object_clear_priv_t clear_priv); > void *bpf_object__priv(struct bpf_object *prog); > > +int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, > + enum bpf_attach_type *expected_attach_type); > + > /* Accessors of bpf_program */ > struct bpf_program; > struct bpf_program *bpf_program__next(struct bpf_program *prog, > -- > 2.17.1 > Thanks for changes Jakub! Acked-by: Andrey Ignatov -- Andrey Ignatov