Skip to content

Commit 5a54c2f

Browse files
committed
perf trace beauty madvise: Generate 'behavior' string table from kernel headers
This is one more case where the way that syscall parameter values are defined in kernel headers are easy to parse using a shell script that will then generate the string table that gets used by the madvise 'behaviour' argument beautifier. This way as soon as the header syncronization mechanism in perf's build system detects a change in a copy of a kernel ABI header and that file is syncronized, we get 'perf trace' updated automagically. So, when we syncronize this: Warning: Kernel ABI header at 'tools/include/uapi/asm-generic/mman-common.h' differs from latest version at 'include/uapi/asm-generic/mman-common.h' We'll get these: #define MADV_WIPEONFORK 18 /* Zero memory on fork, child only */ #define MADV_KEEPONFORK 19 /* Undo MADV_WIPEONFORK */ Cc: Adrian Hunter <[email protected]> Cc: David Ahern <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Wang Nan <[email protected]> Link: http://lkml.kernel.org/n/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 5c9295b commit 5a54c2f

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

tools/perf/Makefile.perf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,13 @@ perf_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/perf_ioctl.sh
441441
$(perf_ioctl_array): $(perf_hdr_dir)/perf_event.h $(perf_ioctl_tbl)
442442
$(Q)$(SHELL) '$(perf_ioctl_tbl)' $(perf_hdr_dir) > $@
443443

444+
madvise_behavior_array := $(beauty_outdir)/madvise_behavior_array.c
445+
madvise_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
446+
madvise_behavior_tbl := $(srctree)/tools/perf/trace/beauty/madvise_behavior.sh
447+
448+
$(madvise_behavior_array): $(madvise_hdr_dir)/mman-common.h $(madvise_behavior_tbl)
449+
$(Q)$(SHELL) '$(madvise_behavior_tbl)' $(madvise_hdr_dir) > $@
450+
444451
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
445452

446453
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
@@ -541,6 +548,7 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
541548
$(sndrv_ctl_ioctl_array) \
542549
$(kvm_ioctl_array) \
543550
$(vhost_virtio_ioctl_array) \
551+
$(madvise_behavior_array) \
544552
$(perf_ioctl_array)
545553

546554
$(OUTPUT)%.o: %.c prepare FORCE
@@ -814,6 +822,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
814822
$(OUTPUT)util/intel-pt-decoder/inat-tables.c \
815823
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
816824
$(OUTPUT)pmu-events/pmu-events.c \
825+
$(OUTPUT)$(madvise_behavior_array) \
817826
$(OUTPUT)$(drm_ioctl_array) \
818827
$(OUTPUT)$(pkey_alloc_access_rights_array) \
819828
$(OUTPUT)$(sndrv_ctl_ioctl_array) \
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/sh
2+
3+
header_dir=$1
4+
5+
printf "static const char *madvise_advices[] = {\n"
6+
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MADV_([[:alnum:]_]+)[[:space:]]+([[:digit:]]+)[[:space:]]*.*'
7+
egrep $regex ${header_dir}/mman-common.h | \
8+
sed -r "s/$regex/\2 \1/g" | \
9+
sort -n | xargs printf "\t[%s] = \"%s\",\n"
10+
printf "};\n"

tools/perf/trace/beauty/mmap.c

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -94,35 +94,21 @@ static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size,
9494

9595
#define SCA_MREMAP_FLAGS syscall_arg__scnprintf_mremap_flags
9696

97+
static size_t madvise__scnprintf_behavior(int behavior, char *bf, size_t size)
98+
{
99+
#include "trace/beauty/generated/madvise_behavior_array.c"
100+
static DEFINE_STRARRAY(madvise_advices);
101+
102+
if (behavior < strarray__madvise_advices.nr_entries && strarray__madvise_advices.entries[behavior] != NULL)
103+
return scnprintf(bf, size, "MADV_%s", strarray__madvise_advices.entries[behavior]);
104+
105+
return scnprintf(bf, size, "%#", behavior);
106+
}
107+
97108
static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size,
98109
struct syscall_arg *arg)
99110
{
100-
int behavior = arg->val;
101-
102-
switch (behavior) {
103-
#define P_MADV_BHV(n) case MADV_##n: return scnprintf(bf, size, #n)
104-
P_MADV_BHV(NORMAL);
105-
P_MADV_BHV(RANDOM);
106-
P_MADV_BHV(SEQUENTIAL);
107-
P_MADV_BHV(WILLNEED);
108-
P_MADV_BHV(DONTNEED);
109-
P_MADV_BHV(FREE);
110-
P_MADV_BHV(REMOVE);
111-
P_MADV_BHV(DONTFORK);
112-
P_MADV_BHV(DOFORK);
113-
P_MADV_BHV(HWPOISON);
114-
P_MADV_BHV(SOFT_OFFLINE);
115-
P_MADV_BHV(MERGEABLE);
116-
P_MADV_BHV(UNMERGEABLE);
117-
P_MADV_BHV(HUGEPAGE);
118-
P_MADV_BHV(NOHUGEPAGE);
119-
P_MADV_BHV(DONTDUMP);
120-
P_MADV_BHV(DODUMP);
121-
#undef P_MADV_BHV
122-
default: break;
123-
}
124-
125-
return scnprintf(bf, size, "%#x", behavior);
111+
return madvise__scnprintf_behavior(arg->val, bf, size);
126112
}
127113

128114
#define SCA_MADV_BHV syscall_arg__scnprintf_madvise_behavior

0 commit comments

Comments
 (0)