Commit a459f4bb authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov
Browse files

libbpf: improve old BPF skeleton handling for map auto-attach



Improve how we handle old BPF skeletons when it comes to BPF map
auto-attachment. Emit one warn-level message per each struct_ops map
that could have been auto-attached, if user provided recent enough BPF
skeleton version. Don't spam log if there are no relevant struct_ops
maps, though.

This should help users realize that they probably need to regenerate BPF
skeleton header with more recent bpftool/libbpf-cargo (or whatever other
means of BPF skeleton generation).

Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20240708204540.4188946-4-andrii@kernel.org


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 99fb9531
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -13967,32 +13967,34 @@ int bpf_object__attach_skeleton(struct bpf_object_skeleton *s)
		 */
	}

	/* Skeleton is created with earlier version of bpftool
	 * which does not support auto-attachment
	 */
	if (s->map_skel_sz < sizeof(struct bpf_map_skeleton))
		return 0;

	for (i = 0; i < s->map_cnt; i++) {
		struct bpf_map_skeleton *map_skel = (void *)s->maps + i * s->map_skel_sz;
		struct bpf_map *map = *map_skel->map;
		struct bpf_link **link = map_skel->link;
		struct bpf_link **link;

		if (!map->autocreate || !map->autoattach)
			continue;

		if (*link)
			continue;

		/* only struct_ops maps can be attached */
		if (!bpf_map__is_struct_ops(map))
			continue;
		*link = bpf_map__attach_struct_ops(map);

		/* skeleton is created with earlier version of bpftool, notify user */
		if (s->map_skel_sz < offsetofend(struct bpf_map_skeleton, link)) {
			pr_warn("map '%s': BPF skeleton version is old, skipping map auto-attachment...\n",
				bpf_map__name(map));
			continue;
		}

		link = map_skel->link;
		if (*link)
			continue;

		*link = bpf_map__attach_struct_ops(map);
		if (!*link) {
			err = -errno;
			pr_warn("map '%s': failed to auto-attach: %d\n",
				bpf_map__name(map), err);
			pr_warn("map '%s': failed to auto-attach: %d\n", bpf_map__name(map), err);
			return libbpf_err(err);
		}
	}