mbox series

[bpf-next,v1,0/8] libbpf: type suffixes and autocreate flag for struct_ops maps

Message ID 20240227204556.17524-1-eddyz87@gmail.com (mailing list archive)
Headers show
Series libbpf: type suffixes and autocreate flag for struct_ops maps | expand

Message

Eduard Zingerman Feb. 27, 2024, 8:45 p.m. UTC
Tweak struct_ops related APIs to allow the following features:
- specify version suffixes for stuct_ops map types;
- share same BPF program between several map definitions with
  different local BTF types, assuming only maps with same
  kernel BTF type would be selected for load;
- toggle autocreate flag for struct_ops maps;
- toggle autoload for referenced struct_ops programs
  when autocreate flag of struct_ops maps is toggled.

This would allow loading programs like below:

    SEC("struct_ops/foo") int BPF_PROG(foo) { ... }
    SEC("struct_ops/bar") int BPF_PROG(bar) { ... }

    struct bpf_testmod_ops___v1 {
        int (*foo)(void);
    };

    struct bpf_testmod_ops___v2 {
        int (*foo)(void);
        int (*bar)(void);
    };

    /* Assume kernel type name to be 'test_ops' */
    SEC(".struct_ops.link")
    struct test_ops___v1 map_v1 = {
        /* Program 'foo' shared by maps with
         * different local BTF type
         */
        .foo = (void *)foo
    };

    SEC(".struct_ops.link")
    struct test_ops___v2 map_v2 = {
        .foo = (void *)foo,
        .bar = (void *)bar
    };

Assuming the following tweaks are done before loading:

    /* to load v1 */
    bpf_map__set_autocreate(skel->maps.map_v1, true);
    bpf_map__set_autocreate(skel->maps.map_v2, false);

    /* to load v2 */
    bpf_map__set_autocreate(skel->maps.map_v1, false);
    bpf_map__set_autocreate(skel->maps.map_v2, true);

Patch #7 ties autocreate and autoload flags for struct_ops maps and
programs, I'm curious if people find such bundling useful and in line
with other libbpf APIs.

Eduard Zingerman (8):
  libbpf: allow version suffixes (___smth) for struct_ops types
  libbpf: tie struct_ops programs to kernel BTF ids, not to local ids
  libbpf: honor autocreate flag for struct_ops maps
  selftests/bpf: test struct_ops map definition with type suffix
  selftests/bpf: bad_struct_ops test
  selftests/bpf: test autocreate behavior for struct_ops maps
  libbpf: sync progs autoload with maps autocreate for struct_ops maps
  selftests/bpf: tests for struct_ops autoload/autocreate toggling

 tools/lib/bpf/libbpf.c                        | 105 ++++++++++----
 .../selftests/bpf/bpf_testmod/bpf_testmod.c   |  25 ++++
 .../selftests/bpf/bpf_testmod/bpf_testmod.h   |   4 +
 .../selftests/bpf/prog_tests/bad_struct_ops.c |  42 ++++++
 .../bpf/prog_tests/struct_ops_autocreate.c    | 136 ++++++++++++++++++
 .../bpf/prog_tests/test_struct_ops_module.c   |  32 +++--
 .../selftests/bpf/progs/bad_struct_ops.c      |  17 +++
 .../bpf/progs/struct_ops_autocreate.c         |  42 ++++++
 .../selftests/bpf/progs/struct_ops_module.c   |  21 ++-
 9 files changed, 383 insertions(+), 41 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c
 create mode 100644 tools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c
 create mode 100644 tools/testing/selftests/bpf/progs/bad_struct_ops.c
 create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_autocreate.c

--
2.43.0