Ignore BPF_F_RDONLY_PROG when checking for compatibility for devmaps. The kernel adds the flag to all devmap creates, and this breaks pinning behavior, as libbpf will then check the actual vs user supplied flags and see this difference. Work around this by adding RDONLY_PROG to the users's flags when testing against the pinned map Fixes: 57a00f41644f ("libbpf: Add auto-pinning of maps when loading BPF objects") Signed-off-by: Pramukh Naduthota <pnaduthota@xxxxxxxxxx> --- tools/lib/bpf/libbpf.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 50d41815f431..a3dae26d82d6 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -4818,6 +4818,7 @@ static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) char msg[STRERR_BUFSIZE]; __u32 map_info_len; int err; + unsigned int effective_flags = map->def.map_flags; map_info_len = sizeof(map_info); @@ -4830,11 +4831,16 @@ static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) return false; } + /* The kernel adds RDONLY_PROG to devmaps */ + if (map->def.type == BPF_MAP_TYPE_DEVMAP || + map->def.type == BPF_MAP_TYPE_DEVMAP_HASH) + effective_flags |= BPF_F_RDONLY_PROG; + return (map_info.type == map->def.type && map_info.key_size == map->def.key_size && map_info.value_size == map->def.value_size && map_info.max_entries == map->def.max_entries && - map_info.map_flags == map->def.map_flags && + map_info.map_flags == effective_flags && map_info.map_extra == map->map_extra); } -- 2.30.2