On Mon, Jul 26, 2021 at 8:19 AM Martynas Pumputis <m@xxxxxxxxx> wrote: > > When loading in parallel multiple programs which use the same to-be > pinned map, it is possible that two instances of the loader will call > bpf_object__create_maps() at the same time. If the map doesn't exist > when both instances call bpf_object__reuse_map(), then one of the > instances will fail with EEXIST when calling bpf_map__pin(). > > Fix the race by retrying reusing a map if bpf_map__pin() returns > EEXIST. The fix is similar to the one in iproute2: e4c4685fd6e4 ("bpf: > Fix race condition with map pinning"). > > Before retrying the pinning, we don't do any special cleaning of an > internal map state. The closer code inspection revealed that it's not > required: > > - bpf_object__create_map(): map->inner_map is destroyed after a > successful call, map->fd is closed if pinning fails. > - bpf_object__populate_internal_map(): created map elements is > destroyed upon close(map->fd). > - init_map_slots(): slots are freed after their initialization. > > Cc: Joe Stringer <joe@xxxxxxxxxxx> > Signed-off-by: Martynas Pumputis <m@xxxxxxxxx> > --- Applied to bpf-next, thanks. > tools/lib/bpf/libbpf.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > [...]