mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 15:27:29 +00:00
tools: bpftool: add probes for eBPF helper functions
Similarly to what was done for program types and map types, add a set of probes to test the availability of the different eBPF helper functions on the current system. For each known program type, all known helpers are tested, in order to establish a compatibility matrix. Output is provided as a set of lists of available helpers, one per program type. Sample output: # bpftool feature probe kernel ... Scanning eBPF helper functions... eBPF helpers supported for program type socket_filter: - bpf_map_lookup_elem - bpf_map_update_elem - bpf_map_delete_elem ... eBPF helpers supported for program type kprobe: - bpf_map_lookup_elem - bpf_map_update_elem - bpf_map_delete_elem ... # bpftool --json --pretty feature probe kernel { ... "helpers": { "socket_filter_available_helpers": ["bpf_map_lookup_elem", \ "bpf_map_update_elem","bpf_map_delete_elem", ... ], "kprobe_available_helpers": ["bpf_map_lookup_elem", \ "bpf_map_update_elem","bpf_map_delete_elem", ... ], ... } } v5: - In libbpf.map, move global symbol to the new LIBBPF_0.0.2 section. v4: - Use "enum bpf_func_id" instead of "__u32" in bpf_probe_helper() declaration for the type of the argument used to pass the id of the helper to probe. - Undef BPF_HELPER_MAKE_ENTRY after using it. v3: - Do not pass kernel version from bpftool to libbpf probes (kernel version for testing program with kprobes is retrieved directly from libbpf). - Dump one list of available helpers per program type (instead of one list of compatible program types per helper). v2: - Move probes from bpftool to libbpf. - Test all program types for each helper, print a list of working prog types for each helper. - Fall back on include/uapi/linux/bpf.h for names and ids of helpers. - Remove C-style macros output from this patch. Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Stanislav Fomichev <sdf@google.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
f99e166397
commit
2d3ea5e85d
5 changed files with 121 additions and 0 deletions
|
@ -25,6 +25,13 @@ enum probe_component {
|
|||
COMPONENT_KERNEL,
|
||||
};
|
||||
|
||||
#define BPF_HELPER_MAKE_ENTRY(name) [BPF_FUNC_ ## name] = "bpf_" # name
|
||||
static const char * const helper_name[] = {
|
||||
__BPF_FUNC_MAPPER(BPF_HELPER_MAKE_ENTRY)
|
||||
};
|
||||
|
||||
#undef BPF_HELPER_MAKE_ENTRY
|
||||
|
||||
/* Miscellaneous utility functions */
|
||||
|
||||
static bool check_procfs(void)
|
||||
|
@ -458,6 +465,44 @@ static void probe_map_type(enum bpf_map_type map_type)
|
|||
print_bool_feature(feat_name, plain_desc, res);
|
||||
}
|
||||
|
||||
static void
|
||||
probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type)
|
||||
{
|
||||
const char *ptype_name = prog_type_name[prog_type];
|
||||
char feat_name[128];
|
||||
unsigned int id;
|
||||
bool res;
|
||||
|
||||
if (json_output) {
|
||||
sprintf(feat_name, "%s_available_helpers", ptype_name);
|
||||
jsonw_name(json_wtr, feat_name);
|
||||
jsonw_start_array(json_wtr);
|
||||
} else {
|
||||
printf("eBPF helpers supported for program type %s:",
|
||||
ptype_name);
|
||||
}
|
||||
|
||||
for (id = 1; id < ARRAY_SIZE(helper_name); id++) {
|
||||
if (!supported_type)
|
||||
res = false;
|
||||
else
|
||||
res = bpf_probe_helper(id, prog_type, 0);
|
||||
|
||||
if (json_output) {
|
||||
if (res)
|
||||
jsonw_string(json_wtr, helper_name[id]);
|
||||
} else {
|
||||
if (res)
|
||||
printf("\n\t- %s", helper_name[id]);
|
||||
}
|
||||
}
|
||||
|
||||
if (json_output)
|
||||
jsonw_end_array(json_wtr);
|
||||
else
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static int do_probe(int argc, char **argv)
|
||||
{
|
||||
enum probe_component target = COMPONENT_UNSPEC;
|
||||
|
@ -533,6 +578,12 @@ static int do_probe(int argc, char **argv)
|
|||
for (i = BPF_MAP_TYPE_UNSPEC + 1; i < map_type_name_size; i++)
|
||||
probe_map_type(i);
|
||||
|
||||
print_end_then_start_section("helpers",
|
||||
"Scanning eBPF helper functions...");
|
||||
|
||||
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
|
||||
probe_helpers_for_progtype(i, supported_types[i]);
|
||||
|
||||
exit_close_json:
|
||||
if (json_output) {
|
||||
/* End current "section" of probes */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue