Skip to content

Commit

Permalink
bpftool: Make probes which emit dmesg warnings optional
Browse files Browse the repository at this point in the history
Probes related to bpf_probe_write_user and bpf_trace_printk helpers emit
dmesg warnings which might be confusing for people running bpftool on
production environments. This change filters them out by default and
introduces the new positional argument "full" which enables all
available probes.

Signed-off-by: Michal Rostecki <mrostecki@opensuse.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20200226165941.6379-3-mrostecki@opensuse.org
  • Loading branch information
Michal Rostecki authored and Daniel Borkmann committed Feb 26, 2020
1 parent 6b52ca4 commit 368cb0e
Showing 1 changed file with 49 additions and 21 deletions.
70 changes: 49 additions & 21 deletions tools/bpf/bpftool/feature.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,14 +513,39 @@ probe_map_type(enum bpf_map_type map_type, const char *define_prefix,
define_prefix);
}

static void
probe_helper_for_progtype(enum bpf_prog_type prog_type, bool supported_type,
const char *define_prefix, unsigned int id,
const char *ptype_name, __u32 ifindex)
{
bool res;

if (!supported_type)
res = false;
else
res = bpf_probe_helper(id, prog_type, ifindex);

if (json_output) {
if (res)
jsonw_string(json_wtr, helper_name[id]);
} else if (define_prefix) {
printf("#define %sBPF__PROG_TYPE_%s__HELPER_%s %s\n",
define_prefix, ptype_name, helper_name[id],
res ? "1" : "0");
} else {
if (res)
printf("\n\t- %s", helper_name[id]);
}
}

static void
probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type,
const char *define_prefix, __u32 ifindex)
const char *define_prefix, bool full_mode,
__u32 ifindex)
{
const char *ptype_name = prog_type_name[prog_type];
char feat_name[128];
unsigned int id;
bool res;

if (ifindex)
/* Only test helpers for offload-able program types */
Expand All @@ -542,21 +567,19 @@ probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type,
}

for (id = 1; id < ARRAY_SIZE(helper_name); id++) {
if (!supported_type)
res = false;
else
res = bpf_probe_helper(id, prog_type, ifindex);

if (json_output) {
if (res)
jsonw_string(json_wtr, helper_name[id]);
} else if (define_prefix) {
printf("#define %sBPF__PROG_TYPE_%s__HELPER_%s %s\n",
define_prefix, ptype_name, helper_name[id],
res ? "1" : "0");
} else {
if (res)
printf("\n\t- %s", helper_name[id]);
/* Skip helper functions which emit dmesg messages when not in
* the full mode.
*/
switch (id) {
case BPF_FUNC_trace_printk:
case BPF_FUNC_probe_write_user:
if (!full_mode)
continue;
/* fallthrough */
default:
probe_helper_for_progtype(prog_type, supported_type,
define_prefix, id, ptype_name,
ifindex);
}
}

Expand Down Expand Up @@ -655,7 +678,8 @@ static void section_map_types(const char *define_prefix, __u32 ifindex)
}

static void
section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex)
section_helpers(bool *supported_types, const char *define_prefix,
bool full_mode, __u32 ifindex)
{
unsigned int i;

Expand All @@ -681,7 +705,7 @@ section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex)
define_prefix);
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
probe_helpers_for_progtype(i, supported_types[i],
define_prefix, ifindex);
define_prefix, full_mode, ifindex);

print_end_section();
}
Expand All @@ -701,6 +725,7 @@ static int do_probe(int argc, char **argv)
enum probe_component target = COMPONENT_UNSPEC;
const char *define_prefix = NULL;
bool supported_types[128] = {};
bool full_mode = false;
__u32 ifindex = 0;
char *ifname;

Expand Down Expand Up @@ -740,6 +765,9 @@ static int do_probe(int argc, char **argv)
strerror(errno));
return -1;
}
} else if (is_prefix(*argv, "full")) {
full_mode = true;
NEXT_ARG();
} else if (is_prefix(*argv, "macros") && !define_prefix) {
define_prefix = "";
NEXT_ARG();
Expand Down Expand Up @@ -775,7 +803,7 @@ static int do_probe(int argc, char **argv)
goto exit_close_json;
section_program_types(supported_types, define_prefix, ifindex);
section_map_types(define_prefix, ifindex);
section_helpers(supported_types, define_prefix, ifindex);
section_helpers(supported_types, define_prefix, full_mode, ifindex);
section_misc(define_prefix, ifindex);

exit_close_json:
Expand All @@ -794,7 +822,7 @@ static int do_help(int argc, char **argv)
}

fprintf(stderr,
"Usage: %s %s probe [COMPONENT] [macros [prefix PREFIX]]\n"
"Usage: %s %s probe [COMPONENT] [full] [macros [prefix PREFIX]]\n"
" %s %s help\n"
"\n"
" COMPONENT := { kernel | dev NAME }\n"
Expand Down

0 comments on commit 368cb0e

Please sign in to comment.