Message ID | 20230709025630.3735-10-laoar.shao@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 62b57e3ddd64002f5b3f6fb2ea50b79a2994cfec |
Delegated to: | BPF |
Headers | show |
Series | bpf: Support ->fill_link_info for kprobe_multi and perf_event links | expand |
On 09/07/2023 03:56, Yafang Shao wrote: > Add new functions and macros to get perf event names. These names except > the perf_type_name are all copied from > tool/perf/util/{parse-events,evsel}.c, so that in the future we will > have a good chance to use the same code. > > Suggested-by: Jiri Olsa <olsajiri@gmail.com> > Signed-off-by: Yafang Shao <laoar.shao@gmail.com> > Reviewed-by: Quentin Monnet <quentin@isovalent.com> > Acked-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/bpf/bpftool/link.c | 67 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 67 insertions(+) > > diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c > index a4f5a436777f..8e4d9176a6e8 100644 > --- a/tools/bpf/bpftool/link.c > +++ b/tools/bpf/bpftool/link.c [...] > +#define perf_event_name(array, id) ({ \ > + const char *event_str = NULL; \ > + \ > + if ((id) >= 0 && (id) < ARRAY_SIZE(array)) \ Hi Yafang, I'm observing build warnings when building bpftool after you series: link.c: In function ‘perf_config_hw_cache_str’: link.c:86:18: warning: comparison of unsigned expression in ‘>= 0’ is always true [-Wtype-limits] 86 | if ((id) >= 0 && (id) < ARRAY_SIZE(array)) \ | ^~ link.c:320:20: note: in expansion of macro ‘perf_event_name’ 320 | hw_cache = perf_event_name(evsel__hw_cache, config & 0xff); | ^~~~~~~~~~~~~~~ [... more of the same for the other calls to perf_event_name ...] (using GCC 11.4.0) Could you please send a follow-up to suppress them? We're always passing unsigned, so it should be safe to drop the check on (id) >= 0. Thanks, Quentin
On Tue, Aug 29, 2023 at 5:20 PM Quentin Monnet <quentin@isovalent.com> wrote: > > On 09/07/2023 03:56, Yafang Shao wrote: > > Add new functions and macros to get perf event names. These names except > > the perf_type_name are all copied from > > tool/perf/util/{parse-events,evsel}.c, so that in the future we will > > have a good chance to use the same code. > > > > Suggested-by: Jiri Olsa <olsajiri@gmail.com> > > Signed-off-by: Yafang Shao <laoar.shao@gmail.com> > > Reviewed-by: Quentin Monnet <quentin@isovalent.com> > > Acked-by: Jiri Olsa <jolsa@kernel.org> > > --- > > tools/bpf/bpftool/link.c | 67 ++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 67 insertions(+) > > > > diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c > > index a4f5a436777f..8e4d9176a6e8 100644 > > --- a/tools/bpf/bpftool/link.c > > +++ b/tools/bpf/bpftool/link.c > > [...] > > > +#define perf_event_name(array, id) ({ \ > > + const char *event_str = NULL; \ > > + \ > > + if ((id) >= 0 && (id) < ARRAY_SIZE(array)) \ > > Hi Yafang, > > I'm observing build warnings when building bpftool after you series: > > link.c: In function ‘perf_config_hw_cache_str’: > link.c:86:18: warning: comparison of unsigned expression in ‘>= 0’ is always true [-Wtype-limits] > 86 | if ((id) >= 0 && (id) < ARRAY_SIZE(array)) \ > | ^~ > link.c:320:20: note: in expansion of macro ‘perf_event_name’ > 320 | hw_cache = perf_event_name(evsel__hw_cache, config & 0xff); > | ^~~~~~~~~~~~~~~ > [... more of the same for the other calls to perf_event_name ...] > > (using GCC 11.4.0) > > Could you please send a follow-up to suppress them? We're always passing > unsigned, so it should be safe to drop the check on (id) >= 0. > Thanks for your report. will send a fix soon.
diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c index a4f5a436777f..8e4d9176a6e8 100644 --- a/tools/bpf/bpftool/link.c +++ b/tools/bpf/bpftool/link.c @@ -5,6 +5,7 @@ #include <linux/err.h> #include <linux/netfilter.h> #include <linux/netfilter_arp.h> +#include <linux/perf_event.h> #include <net/if.h> #include <stdio.h> #include <unistd.h> @@ -19,6 +20,72 @@ static struct hashmap *link_table; static struct dump_data dd; +static const char *perf_type_name[PERF_TYPE_MAX] = { + [PERF_TYPE_HARDWARE] = "hardware", + [PERF_TYPE_SOFTWARE] = "software", + [PERF_TYPE_TRACEPOINT] = "tracepoint", + [PERF_TYPE_HW_CACHE] = "hw-cache", + [PERF_TYPE_RAW] = "raw", + [PERF_TYPE_BREAKPOINT] = "breakpoint", +}; + +const char *event_symbols_hw[PERF_COUNT_HW_MAX] = { + [PERF_COUNT_HW_CPU_CYCLES] = "cpu-cycles", + [PERF_COUNT_HW_INSTRUCTIONS] = "instructions", + [PERF_COUNT_HW_CACHE_REFERENCES] = "cache-references", + [PERF_COUNT_HW_CACHE_MISSES] = "cache-misses", + [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "branch-instructions", + [PERF_COUNT_HW_BRANCH_MISSES] = "branch-misses", + [PERF_COUNT_HW_BUS_CYCLES] = "bus-cycles", + [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = "stalled-cycles-frontend", + [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = "stalled-cycles-backend", + [PERF_COUNT_HW_REF_CPU_CYCLES] = "ref-cycles", +}; + +const char *event_symbols_sw[PERF_COUNT_SW_MAX] = { + [PERF_COUNT_SW_CPU_CLOCK] = "cpu-clock", + [PERF_COUNT_SW_TASK_CLOCK] = "task-clock", + [PERF_COUNT_SW_PAGE_FAULTS] = "page-faults", + [PERF_COUNT_SW_CONTEXT_SWITCHES] = "context-switches", + [PERF_COUNT_SW_CPU_MIGRATIONS] = "cpu-migrations", + [PERF_COUNT_SW_PAGE_FAULTS_MIN] = "minor-faults", + [PERF_COUNT_SW_PAGE_FAULTS_MAJ] = "major-faults", + [PERF_COUNT_SW_ALIGNMENT_FAULTS] = "alignment-faults", + [PERF_COUNT_SW_EMULATION_FAULTS] = "emulation-faults", + [PERF_COUNT_SW_DUMMY] = "dummy", + [PERF_COUNT_SW_BPF_OUTPUT] = "bpf-output", + [PERF_COUNT_SW_CGROUP_SWITCHES] = "cgroup-switches", +}; + +const char *evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] = { + [PERF_COUNT_HW_CACHE_L1D] = "L1-dcache", + [PERF_COUNT_HW_CACHE_L1I] = "L1-icache", + [PERF_COUNT_HW_CACHE_LL] = "LLC", + [PERF_COUNT_HW_CACHE_DTLB] = "dTLB", + [PERF_COUNT_HW_CACHE_ITLB] = "iTLB", + [PERF_COUNT_HW_CACHE_BPU] = "branch", + [PERF_COUNT_HW_CACHE_NODE] = "node", +}; + +const char *evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX] = { + [PERF_COUNT_HW_CACHE_OP_READ] = "load", + [PERF_COUNT_HW_CACHE_OP_WRITE] = "store", + [PERF_COUNT_HW_CACHE_OP_PREFETCH] = "prefetch", +}; + +const char *evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX] = { + [PERF_COUNT_HW_CACHE_RESULT_ACCESS] = "refs", + [PERF_COUNT_HW_CACHE_RESULT_MISS] = "misses", +}; + +#define perf_event_name(array, id) ({ \ + const char *event_str = NULL; \ + \ + if ((id) >= 0 && (id) < ARRAY_SIZE(array)) \ + event_str = array[id]; \ + event_str; \ +}) + static int link_parse_fd(int *argc, char ***argv) { int fd;