• Eduard Zingerman's avatar
    libbpf: Honor autocreate flag for struct_ops maps · 8db05261
    Eduard Zingerman authored
    Skip load steps for struct_ops maps not marked for automatic creation.
    This should allow to load bpf object in situations like below:
    
        SEC("struct_ops/foo") int BPF_PROG(foo) { ... }
        SEC("struct_ops/bar") int BPF_PROG(bar) { ... }
    
        struct test_ops___v1 {
        	int (*foo)(void);
        };
    
        struct test_ops___v2 {
        	int (*foo)(void);
        	int (*does_not_exist)(void);
        };
    
        SEC(".struct_ops.link")
        struct test_ops___v1 map_for_old = {
        	.test_1 = (void *)foo
        };
    
        SEC(".struct_ops.link")
        struct test_ops___v2 map_for_new = {
        	.test_1 = (void *)foo,
        	.does_not_exist = (void *)bar
        };
    
    Suppose program is loaded on old kernel that does not have definition
    for 'does_not_exist' struct_ops member. After this commit it would be
    possible to load such object file after the following tweaks:
    
        bpf_program__set_autoload(skel->progs.bar, false);
        bpf_map__set_autocreate(skel->maps.map_for_new, false);
    Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Link: https://lore.kernel.org/bpf/20240306104529.6453-4-eddyz87@gmail.com
    8db05261
libbpf.c 362 KB