Skip to content

libbpf: type suffixes and autocreate flag for struct_ops maps

Eduard Zingerman bpf 4 versions – Applied

Status from this message: This series was applied to bpf/bpf-next.git (master)

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v4 Latest15 patches 1 replyApplied 15/15
  2. v315 patches 23 repliesSuperseded
  3. v215 patches 1 replySuperseded
Earlier versions · 1
VersionPostedPatchesRepliesStatus
v18 patches52 repliesSuperseded

Changelog from the cover letter

- v3 [3] -> v4:
- changes for multiple styling suggestions from Andrii;
- patch #5: libbpf log capture now happens for LIBBPF_INFO and LIBBPF_WARN messages and does not depend on verbosity flags (Andrii);
- patch #6: fixed runtime crash caused by conflict with newly added

Patches in v4 All 15 applied

#Subject and filesSizeRepliesApplied
1/15libbpf: allow version suffixes (___smth) for struct_ops typestools/lib/bpf/libbpf.c+5 -10 repliesApplied
2/15libbpf: tie struct_ops programs to kernel BTF ids, not to local idstools/lib/bpf/libbpf.c+26 -230 repliesApplied
3/15libbpf: honor autocreate flag for struct_ops mapstools/lib/bpf/libbpf.c+15 -30 repliesApplied
4/15selftests/bpf: test struct_ops map definition with type suffixtools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c tools/testing/selftests/bpf/progs/struct_ops_module.c+46 -100 repliesApplied
5/15selftests/bpf: utility functions to capture libbpf log in test_progstools/testing/selftests/bpf/test_progs.c tools/testing/selftests/bpf/test_progs.h+62 -00 repliesApplied
6/15selftests/bpf: bad_struct_ops testtools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c +1 more+88 -00 repliesApplied
7/15selftests/bpf: test autocreate behavior for struct_ops mapstools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c tools/testing/selftests/bpf/progs/struct_ops_autocreate.c+118 -00 repliesApplied
8/15libbpf: sync progs autoload with maps autocreate for struct_ops mapstools/lib/bpf/libbpf.c+43 -00 repliesApplied
9/15selftests/bpf: verify struct_ops autoload/autocreate synctools/testing/selftests/bpf/prog_tests/bad_struct_ops.c tools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c tools/testing/selftests/bpf/progs/bad_struct_ops2.c +1 more+125 -40 repliesApplied
10/15libbpf: replace elf_state->st_ops_* fields with SEC_ST_OPS sec_typetools/lib/bpf/libbpf.c+32 -290 repliesApplied
11/15libbpf: struct_ops in SEC("?.struct_ops") / SEC("?.struct_ops.link")tools/lib/bpf/libbpf.c+14 -10 repliesApplied
12/15libbpf: rewrite btf datasec names starting from '?'tools/lib/bpf/features.c tools/lib/bpf/libbpf.c tools/lib/bpf/libbpf_internal.h+41 -20 repliesApplied
13/15selftests/bpf: test case for SEC("?.struct_ops")tools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c tools/testing/selftests/bpf/progs/struct_ops_autocreate.c+56 -60 repliesApplied
14/15bpf: allow all printable characters in BTF DATASEC nameskernel/bpf/btf.c+15 -11 replyApplied
15/15selftests/bpf: test cases for '?' in BTF namestools/testing/selftests/bpf/prog_tests/btf.c+29 -00 repliesApplied

Reviews trailers per patch

6 of 15 patches have a Reviewed-by or Acked-by.

PatchDavid VernetAndrii Nakryiko
1/15A-b A-b
2/15A-b
3/15A-b
4/15A-b
5/15
6/15A-b
7/15
8/15
9/15
10/15A-b
11/15
12/15
13/15
14/15
15/15

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v4 thread

Cover letter [PATCH bpf-next v4 00/15] libbpf: type suffixes and autocreate flag for struct_ops maps

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;
- automatically toggle autoload for struct_ops programs referenced from struct_ops maps, depending on autocreate status of the corresponding map;
- use SEC("?.struct_ops") and SEC("?.struct_ops.link")
to define struct_ops maps with autocreate == false after object open.

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 #8 ties autocreate and autoload flags for struct_ops maps and programs.

Changelog:
- v3 [3] -> v4:
- changes for multiple styling suggestions from Andrii;
- patch #5: libbpf log capture now happens for LIBBPF_INFO and LIBBPF_WARN messages and does not depend on verbosity flags (Andrii);
- patch #6: fixed runtime crash caused by conflict with newly added

    test case struct_ops_multi_pages;
  - patch #7: fixed free of possibly uninitialized pointer (Daniel)
  - patch #8: simpler algorithm to detect which programs to autoload
    (Andrii);
  - patch #9: added assertions for autoload flag after object load
    (Andrii);
  - patch #12: DATASEC name rewrite in libbpf is now done inplace, no
    new strings added to BTF (Andrii);

- patch #14: allow any printable characters in DATASEC names when kernel validates BTF (Andrii)
- v2 [2] -> v3:
- moved patch #8 logic to be fully done on load

    (requested by Andrii in offlist discussion);

- in patch #9 added test case for shadow vars and autocreate/autoload interaction.
- v1 [1] -> v2:
- fixed memory leak in patch #1 (Kui-Feng);
- improved error messages in patch #2 (Martin, Andrii);
- in bad_struct_ops selftest from patch #6 added .test_2

    map member setup (David);
  - added utility functions to capture libbpf log from selftests (David)
  - in selftests replaced usage of ...__open_and_load by separate
    calls to ..._open() and ..._load() (Andrii);
  - removed serial_... in selftest definitions (Andrii);
  - improved comments in selftest struct_ops_autocreate
    from patch #7 (David);
  - removed autoload toggling logic incompatible with shadow variables
    from bpf_map__set_autocreate(), instead struct_ops programs
    autoload property is computed at struct_ops maps load phase,
    see patch #8 (Kui-Feng, Martin, Andrii);
  - added support for SEC("?.struct_ops") and SEC("?.struct_ops.link")
    (Andrii).

[1] https://lore.kernel.org/bpf/[email protected]/
[2] https://lore.kernel.org/bpf/[email protected]/
[3] https://lore.kernel.org/bpf/[email protected]/

Eduard Zingerman (15):
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: utility functions to capture libbpf log in test_progs 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: verify struct_ops autoload/autocreate sync
libbpf: replace elf_state->st_ops_* fields with SEC_ST_OPS sec_type
libbpf: struct_ops in SEC("?.struct_ops") / SEC("?.struct_ops.link")
libbpf: rewrite btf datasec names starting from '?' selftests/bpf: test case for SEC("?.struct_ops")
bpf: allow all printable characters in BTF DATASEC names selftests/bpf: test cases for '?' in BTF names

 kernel/bpf/btf.c                              |  16 +-
 tools/lib/bpf/features.c                      |  22 ++
 tools/lib/bpf/libbpf.c                        | 209 +++++++++++++-----
 tools/lib/bpf/libbpf_internal.h               |   2 +
 .../selftests/bpf/bpf_testmod/bpf_testmod.c   |  26 +++
 .../selftests/bpf/bpf_testmod/bpf_testmod.h   |   4 +
 .../selftests/bpf/prog_tests/bad_struct_ops.c |  67 ++++++
 tools/testing/selftests/bpf/prog_tests/btf.c  |  29 +++
 .../bpf/prog_tests/struct_ops_autocreate.c    | 159 +++++++++++++
 .../bpf/prog_tests/test_struct_ops_module.c   |  33 ++-
 .../selftests/bpf/progs/bad_struct_ops.c      |  25 +++
 .../selftests/bpf/progs/bad_struct_ops2.c     |  14 ++
 .../bpf/progs/struct_ops_autocreate.c         |  52 +++++
 .../bpf/progs/struct_ops_autocreate2.c        |  32 +++
 .../selftests/bpf/progs/struct_ops_module.c   |  21 +-
 tools/testing/selftests/bpf/test_progs.c      |  59 +++++
 tools/testing/selftests/bpf/test_progs.h      |   3 +
 17 files changed, 704 insertions(+), 69 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/bad_struct_ops2.c
 create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_autocreate.c
 create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_autocreate2.c
Signature · 1 line
2.43.0