Use similar approach to enum bpf_func_id and generate enumerators using a macro with macro callback. This approach allows to generate derivative tables for string-based lookups and whatnot. In this particular case, this mapper macro will be used for parsing BPF FS delegate_cmds mount option and their human-readable output format in mount info. Validated no regressions using before/after BTF through `bpftool btf dump <file> format c` command. Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> --- include/uapi/linux/bpf.h | 81 ++++++++++++++++++---------------- tools/include/uapi/linux/bpf.h | 81 ++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 76 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index e0545201b55f..d05ea24ace3f 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -893,47 +893,52 @@ union bpf_iter_link_info { * to the object have been closed and no references remain pinned to the * filesystem or attached (for example, bound to a program or device). */ +#define __BPF_CMD_MAPPER(FN, ctx...) \ + FN(BPF_MAP_CREATE, 0) \ + FN(BPF_MAP_LOOKUP_ELEM, 1) \ + FN(BPF_MAP_UPDATE_ELEM, 2) \ + FN(BPF_MAP_DELETE_ELEM, 3) \ + FN(BPF_MAP_GET_NEXT_KEY, 4) \ + FN(BPF_PROG_LOAD, 5) \ + FN(BPF_OBJ_PIN, 6) \ + FN(BPF_OBJ_GET, 7) \ + FN(BPF_PROG_ATTACH, 8) \ + FN(BPF_PROG_DETACH, 9) \ + FN(BPF_PROG_TEST_RUN, 10) \ + FN(BPF_PROG_RUN, 10) /* alias for BPF_PROG_TEST_RUN */ \ + FN(BPF_PROG_GET_NEXT_ID, 11) \ + FN(BPF_MAP_GET_NEXT_ID, 12) \ + FN(BPF_PROG_GET_FD_BY_ID, 13) \ + FN(BPF_MAP_GET_FD_BY_ID, 14) \ + FN(BPF_OBJ_GET_INFO_BY_FD, 15) \ + FN(BPF_PROG_QUERY, 16) \ + FN(BPF_RAW_TRACEPOINT_OPEN, 17) \ + FN(BPF_BTF_LOAD, 18) \ + FN(BPF_BTF_GET_FD_BY_ID, 19) \ + FN(BPF_TASK_FD_QUERY, 20) \ + FN(BPF_MAP_LOOKUP_AND_DELETE_ELEM, 21) \ + FN(BPF_MAP_FREEZE, 22) \ + FN(BPF_BTF_GET_NEXT_ID, 23) \ + FN(BPF_MAP_LOOKUP_BATCH, 24) \ + FN(BPF_MAP_LOOKUP_AND_DELETE_BATCH, 25) \ + FN(BPF_MAP_UPDATE_BATCH, 26) \ + FN(BPF_MAP_DELETE_BATCH, 27) \ + FN(BPF_LINK_CREATE, 28) \ + FN(BPF_LINK_UPDATE, 29) \ + FN(BPF_LINK_GET_FD_BY_ID, 30) \ + FN(BPF_LINK_GET_NEXT_ID, 31) \ + FN(BPF_ENABLE_STATS, 32) \ + FN(BPF_ITER_CREATE, 33) \ + FN(BPF_LINK_DETACH, 34) \ + FN(BPF_PROG_BIND_MAP, 35) \ + FN(BPF_TOKEN_CREATE, 36) \ + /* */ +#define __BPF_CMD_FN(x, y) x = y, enum bpf_cmd { - BPF_MAP_CREATE, - BPF_MAP_LOOKUP_ELEM, - BPF_MAP_UPDATE_ELEM, - BPF_MAP_DELETE_ELEM, - BPF_MAP_GET_NEXT_KEY, - BPF_PROG_LOAD, - BPF_OBJ_PIN, - BPF_OBJ_GET, - BPF_PROG_ATTACH, - BPF_PROG_DETACH, - BPF_PROG_TEST_RUN, - BPF_PROG_RUN = BPF_PROG_TEST_RUN, - BPF_PROG_GET_NEXT_ID, - BPF_MAP_GET_NEXT_ID, - BPF_PROG_GET_FD_BY_ID, - BPF_MAP_GET_FD_BY_ID, - BPF_OBJ_GET_INFO_BY_FD, - BPF_PROG_QUERY, - BPF_RAW_TRACEPOINT_OPEN, - BPF_BTF_LOAD, - BPF_BTF_GET_FD_BY_ID, - BPF_TASK_FD_QUERY, - BPF_MAP_LOOKUP_AND_DELETE_ELEM, - BPF_MAP_FREEZE, - BPF_BTF_GET_NEXT_ID, - BPF_MAP_LOOKUP_BATCH, - BPF_MAP_LOOKUP_AND_DELETE_BATCH, - BPF_MAP_UPDATE_BATCH, - BPF_MAP_DELETE_BATCH, - BPF_LINK_CREATE, - BPF_LINK_UPDATE, - BPF_LINK_GET_FD_BY_ID, - BPF_LINK_GET_NEXT_ID, - BPF_ENABLE_STATS, - BPF_ITER_CREATE, - BPF_LINK_DETACH, - BPF_PROG_BIND_MAP, - BPF_TOKEN_CREATE, + __BPF_CMD_MAPPER(__BPF_CMD_FN) __MAX_BPF_CMD, }; +#undef __BPF_CMD_FN enum bpf_map_type { BPF_MAP_TYPE_UNSPEC, diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index e0545201b55f..d05ea24ace3f 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -893,47 +893,52 @@ union bpf_iter_link_info { * to the object have been closed and no references remain pinned to the * filesystem or attached (for example, bound to a program or device). */ +#define __BPF_CMD_MAPPER(FN, ctx...) \ + FN(BPF_MAP_CREATE, 0) \ + FN(BPF_MAP_LOOKUP_ELEM, 1) \ + FN(BPF_MAP_UPDATE_ELEM, 2) \ + FN(BPF_MAP_DELETE_ELEM, 3) \ + FN(BPF_MAP_GET_NEXT_KEY, 4) \ + FN(BPF_PROG_LOAD, 5) \ + FN(BPF_OBJ_PIN, 6) \ + FN(BPF_OBJ_GET, 7) \ + FN(BPF_PROG_ATTACH, 8) \ + FN(BPF_PROG_DETACH, 9) \ + FN(BPF_PROG_TEST_RUN, 10) \ + FN(BPF_PROG_RUN, 10) /* alias for BPF_PROG_TEST_RUN */ \ + FN(BPF_PROG_GET_NEXT_ID, 11) \ + FN(BPF_MAP_GET_NEXT_ID, 12) \ + FN(BPF_PROG_GET_FD_BY_ID, 13) \ + FN(BPF_MAP_GET_FD_BY_ID, 14) \ + FN(BPF_OBJ_GET_INFO_BY_FD, 15) \ + FN(BPF_PROG_QUERY, 16) \ + FN(BPF_RAW_TRACEPOINT_OPEN, 17) \ + FN(BPF_BTF_LOAD, 18) \ + FN(BPF_BTF_GET_FD_BY_ID, 19) \ + FN(BPF_TASK_FD_QUERY, 20) \ + FN(BPF_MAP_LOOKUP_AND_DELETE_ELEM, 21) \ + FN(BPF_MAP_FREEZE, 22) \ + FN(BPF_BTF_GET_NEXT_ID, 23) \ + FN(BPF_MAP_LOOKUP_BATCH, 24) \ + FN(BPF_MAP_LOOKUP_AND_DELETE_BATCH, 25) \ + FN(BPF_MAP_UPDATE_BATCH, 26) \ + FN(BPF_MAP_DELETE_BATCH, 27) \ + FN(BPF_LINK_CREATE, 28) \ + FN(BPF_LINK_UPDATE, 29) \ + FN(BPF_LINK_GET_FD_BY_ID, 30) \ + FN(BPF_LINK_GET_NEXT_ID, 31) \ + FN(BPF_ENABLE_STATS, 32) \ + FN(BPF_ITER_CREATE, 33) \ + FN(BPF_LINK_DETACH, 34) \ + FN(BPF_PROG_BIND_MAP, 35) \ + FN(BPF_TOKEN_CREATE, 36) \ + /* */ +#define __BPF_CMD_FN(x, y) x = y, enum bpf_cmd { - BPF_MAP_CREATE, - BPF_MAP_LOOKUP_ELEM, - BPF_MAP_UPDATE_ELEM, - BPF_MAP_DELETE_ELEM, - BPF_MAP_GET_NEXT_KEY, - BPF_PROG_LOAD, - BPF_OBJ_PIN, - BPF_OBJ_GET, - BPF_PROG_ATTACH, - BPF_PROG_DETACH, - BPF_PROG_TEST_RUN, - BPF_PROG_RUN = BPF_PROG_TEST_RUN, - BPF_PROG_GET_NEXT_ID, - BPF_MAP_GET_NEXT_ID, - BPF_PROG_GET_FD_BY_ID, - BPF_MAP_GET_FD_BY_ID, - BPF_OBJ_GET_INFO_BY_FD, - BPF_PROG_QUERY, - BPF_RAW_TRACEPOINT_OPEN, - BPF_BTF_LOAD, - BPF_BTF_GET_FD_BY_ID, - BPF_TASK_FD_QUERY, - BPF_MAP_LOOKUP_AND_DELETE_ELEM, - BPF_MAP_FREEZE, - BPF_BTF_GET_NEXT_ID, - BPF_MAP_LOOKUP_BATCH, - BPF_MAP_LOOKUP_AND_DELETE_BATCH, - BPF_MAP_UPDATE_BATCH, - BPF_MAP_DELETE_BATCH, - BPF_LINK_CREATE, - BPF_LINK_UPDATE, - BPF_LINK_GET_FD_BY_ID, - BPF_LINK_GET_NEXT_ID, - BPF_ENABLE_STATS, - BPF_ITER_CREATE, - BPF_LINK_DETACH, - BPF_PROG_BIND_MAP, - BPF_TOKEN_CREATE, + __BPF_CMD_MAPPER(__BPF_CMD_FN) __MAX_BPF_CMD, }; +#undef __BPF_CMD_FN enum bpf_map_type { BPF_MAP_TYPE_UNSPEC, -- 2.34.1