On Fri, Dec 10, 2021 at 1:40 AM Shuyi Cheng <chengshuyi@xxxxxxxxxxxxxxxxx> wrote: > > Fix error: "failed to pin map: Bad file descriptor, path: > /sys/fs/bpf/_rodata_str1_1." > > In the old kernel, the global data map will not be created, see [0]. So > we should skip the pinning of the global data map to avoid > bpf_object__pin_maps returning error. Therefore, when the map is not > created, we mark “map->skipped" as true and then check during relocation > and during pinning. > > Signed-off-by: Shuyi Cheng <chengshuyi@xxxxxxxxxxxxxxxxx> > --- > v2: > https://lore.kernel.org/bpf/CAEf4Bzbxf4kEtCEWBSonomEp7ZiKBD50k-U941i=okKfgKb6FQ@xxxxxxxxxxxxxx/T/#mb884d33b1b5b8e5dfb5a362af0d3c025510b5a4c > v2->v3: > -- adjust the "bool skipped" position > > v1: > https://lore.kernel.org/bpf/CAEf4BzbtQGnGZTLbTdy1GHK54f5S7YNFQak7BuEfaqGEwqNNJA@xxxxxxxxxxxxxx/T/#m80ec7f8bc69dbcf4a5945e2aa6f16145901afc40 > v1->v2: > -- add "bool skipped" to struct bpf_map. > -- replace "bpf_map__is_internal(map) && !kernel_supports(obj, > FEAT_GLOBAL_DATA))" with map->skipped > Ok, I don't know what exactly is happening, but your patch really-really confuses Patchworks. If you try to download it from Patchworks, you'll get bpf_object__pin_maps part of the patch put somewhere here and completely confusing everything. Try not to use "--" as a list marker, you can see above it's actually used to demarcate where the commit message ends and patch starts, so that might be one of the reasons. Adding space in front of bullet points is also not a bad idea. Either way, I applied it manually locally and pushed to bpf-next. Thanks. I'll cherry-pick this one and btf__dedup_deprecated fix from yesterday into github libbpf and will cut a bugfix v0.6.1 release shortly. > tools/lib/bpf/libbpf.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 18d95c6a89fe..d027e1d620fc 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -431,6 +431,7 @@ struct bpf_map { > char *pin_path; > bool pinned; > bool reused; > + bool skipped; > __u64 map_extra; > }; > > @@ -5087,8 +5088,10 @@ bpf_object__create_maps(struct bpf_object *obj) > * kernels. > */ > if (bpf_map__is_internal(map) && > - !kernel_supports(obj, FEAT_GLOBAL_DATA)) > + !kernel_supports(obj, FEAT_GLOBAL_DATA)) { > + map->skipped = true; > continue; > + } > > retried = false; > retry: > @@ -5717,8 +5720,7 @@ bpf_object__relocate_data(struct bpf_object *obj, > struct bpf_program *prog) > } else { > const struct bpf_map *map = &obj->maps[relo->map_idx]; > > - if (bpf_map__is_internal(map) && > - !kernel_supports(obj, FEAT_GLOBAL_DATA)) { > + if (map->skipped) { > pr_warn("prog '%s': relo #%d: kernel doesn't support global data\n", > prog->name, i); > return -ENOTSUP; > @@ -7926,6 +7928,9 @@ int bpf_object__pin_maps(struct bpf_object *obj, > const char *path) > char *pin_path = NULL; > char buf[PATH_MAX]; > > + if (map->skipped) > + continue; > + > if (path) { > int len; > > -- > 2.19.1.6.gb485710b