• Martynas Pumputis's avatar
    libbpf: Fix reuse of pinned map on older kernel · 97eb3138
    Martynas Pumputis authored
    When loading a BPF program with a pinned map, the loader checks whether
    the pinned map can be reused, i.e. their properties match. To derive
    such of the pinned map, the loader invokes BPF_OBJ_GET_INFO_BY_FD and
    then does the comparison.
    
    Unfortunately, on < 4.12 kernels the BPF_OBJ_GET_INFO_BY_FD is not
    available, so loading the program fails with the following error:
    
    	libbpf: failed to get map info for map FD 5: Invalid argument
    	libbpf: couldn't reuse pinned map at
    		'/sys/fs/bpf/tc/globals/cilium_call_policy': parameter
    		mismatch"
    	libbpf: map 'cilium_call_policy': error reusing pinned map
    	libbpf: map 'cilium_call_policy': failed to create:
    		Invalid argument(-22)
    	libbpf: failed to load object 'bpf_overlay.o'
    
    To fix this, fallback to derivation of the map properties via
    /proc/$PID/fdinfo/$MAP_FD if BPF_OBJ_GET_INFO_BY_FD fails with EINVAL,
    which can be used as an indicator that the kernel doesn't support
    the latter.
    Signed-off-by: default avatarMartynas Pumputis <m@lambda.lt>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Link: https://lore.kernel.org/bpf/20210712125552.58705-1-m@lambda.lt
    97eb3138
libbpf.c 308 KB