From 8f12a2ff00e5e48ad5618167bac72cad7c9f214e Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 4 May 2018 11:56:15 -0300 Subject: perf bpf: Add 'examples' directories The first one is the bare minimum that bpf infrastructure accepts before it expects actual events to be set up: $ cat tools/perf/examples/bpf/empty.c char _license[] __attribute__((section("license"), used)) = "GPL"; int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE; $ If you remove that "version" line, then it will be refused with: # perf trace -e tools/perf/examples/bpf/empty.c event syntax error: 'tools/perf/examples/bpf/empty.c' \___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost (add -v to see detail) Run 'perf list' for a list of valid events Usage: perf trace [] [] or: perf trace [] -- [] or: perf trace record [] [] or: perf trace record [] -- [] -e, --event event/syscall selector. use 'perf list' to list available events # The next ones will, step by step, show simple filters, then the needs for headers will be made clear, it will be put in place and tested with new examples, rinse, repeat. Back to using this first one to test the perf+bpf infrastructure: If we run it will fail, as no functions are present connecting with, say, a tracepoint or a function using the kprobes or uprobes infrastructure: # perf trace -e tools/perf/examples/bpf/empty.c WARNING: event parser found nothing invalid or unsupported event: 'tools/perf/examples/bpf/empty.c' Run 'perf list' for a list of valid events Usage: perf trace [] [] or: perf trace [] -- [] or: perf trace record [] [] or: perf trace record [] -- [] -e, --event event/syscall selector. use 'perf list' to list available events # But, if we set things up to dump the generated object file to a file, and do this after having run 'make install', still on the developer's $HOME directory: # cat ~/.perfconfig [llvm] dump-obj = true # # perf trace -e ~acme/lib/examples/perf/bpf/empty.c LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o WARNING: event parser found nothing invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c' # We can look at the dumped object file: # ls -la ~acme/lib/examples/perf/bpf/empty.o -rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o # file ~acme/lib/examples/perf/bpf/empty.o /home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped # readelf -sw ~acme/lib/examples/perf/bpf/empty.o Symbol table '.symtab' contains 3 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version # # tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o null # Cc: Adrian Hunter Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Cc: Wang Nan Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/examples/bpf/empty.c | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tools/perf/examples/bpf/empty.c (limited to 'tools/perf/examples/bpf/empty.c') diff --git a/tools/perf/examples/bpf/empty.c b/tools/perf/examples/bpf/empty.c new file mode 100644 index 000000000000..78754df53ac1 --- /dev/null +++ b/tools/perf/examples/bpf/empty.c @@ -0,0 +1,2 @@ +char _license[] __attribute__((section("license"), used)) = "GPL"; +int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE; -- cgit v1.2.3 From dd8e4ead6e983acea959d10252688ef1471106fe Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 4 May 2018 12:23:29 -0300 Subject: perf bpf: Add bpf.h to be used in eBPF proggies So, the first helper is the one shortening a variable/function section attribute, from, for instance: char _license[] __attribute__((section("license"), used)) = "GPL"; to: char _license[] SEC("license") = "GPL"; Convert empty.c to that and it becomes: # cat ~acme/lib/examples/perf/bpf/empty.c #include char _license[] SEC("license") = "GPL"; int _version SEC("version") = LINUX_VERSION_CODE; # Cc: Adrian Hunter Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Cc: Wang Nan Link: https://lkml.kernel.org/n/tip-zmeg52dlvy51rdlhyumfl5yf@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/Makefile.perf | 1 + tools/perf/examples/bpf/empty.c | 6 ++++-- tools/perf/include/bpf/bpf.h | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 tools/perf/include/bpf/bpf.h (limited to 'tools/perf/examples/bpf/empty.c') diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 9343b7d945bb..c63a3971d719 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -770,6 +770,7 @@ endif ifndef NO_LIBBPF $(call QUIET_INSTALL, lib) \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf' + $(INSTALL) include/bpf/*.h '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf' $(call QUIET_INSTALL, lib) \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_examples_instdir_SQ)/bpf' $(INSTALL) examples/bpf/*.c '$(DESTDIR_SQ)$(perf_examples_instdir_SQ)/bpf' diff --git a/tools/perf/examples/bpf/empty.c b/tools/perf/examples/bpf/empty.c index 78754df53ac1..86f97763355d 100644 --- a/tools/perf/examples/bpf/empty.c +++ b/tools/perf/examples/bpf/empty.c @@ -1,2 +1,4 @@ -char _license[] __attribute__((section("license"), used)) = "GPL"; -int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE; +#include + +char _license[] SEC("license") = "GPL"; +int _version SEC("version") = LINUX_VERSION_CODE; diff --git a/tools/perf/include/bpf/bpf.h b/tools/perf/include/bpf/bpf.h new file mode 100644 index 000000000000..003afcab4e51 --- /dev/null +++ b/tools/perf/include/bpf/bpf.h @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef _PERF_BPF_H +#define _PERF_BPF_H +#define SEC(NAME) __attribute__((section(NAME), used)) +#endif /* _PERF_BPF_H */ -- cgit v1.2.3 From 1f477305ab462e2fd1fa8a4c4fa425ad752b3175 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 4 May 2018 15:18:31 -0300 Subject: perf bpf: Add license(NAME) helper To further reduce boilerplate. Cc: Adrian Hunter Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Cc: Wang Nan Link: https://lkml.kernel.org/n/tip-vst6hj335s0ebxzqltes3nsc@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/examples/bpf/5sec.c | 3 +-- tools/perf/examples/bpf/empty.c | 3 +-- tools/perf/include/bpf/bpf.h | 5 +++++ 3 files changed, 7 insertions(+), 4 deletions(-) (limited to 'tools/perf/examples/bpf/empty.c') diff --git a/tools/perf/examples/bpf/5sec.c b/tools/perf/examples/bpf/5sec.c index 3d1ed34aec8b..6fc3697ac749 100644 --- a/tools/perf/examples/bpf/5sec.c +++ b/tools/perf/examples/bpf/5sec.c @@ -40,5 +40,4 @@ int func(void *ctx, int err, long sec) return sec == 5; } -char _license[] SEC("license") = "GPL"; -int _version SEC("version") = LINUX_VERSION_CODE; +license(GPL); diff --git a/tools/perf/examples/bpf/empty.c b/tools/perf/examples/bpf/empty.c index 86f97763355d..3776d26db9e7 100644 --- a/tools/perf/examples/bpf/empty.c +++ b/tools/perf/examples/bpf/empty.c @@ -1,4 +1,3 @@ #include -char _license[] SEC("license") = "GPL"; -int _version SEC("version") = LINUX_VERSION_CODE; +license(GPL); diff --git a/tools/perf/include/bpf/bpf.h b/tools/perf/include/bpf/bpf.h index 003afcab4e51..cdfd18b9c318 100644 --- a/tools/perf/include/bpf/bpf.h +++ b/tools/perf/include/bpf/bpf.h @@ -2,4 +2,9 @@ #ifndef _PERF_BPF_H #define _PERF_BPF_H #define SEC(NAME) __attribute__((section(NAME), used)) + +#define license(name) \ +char _license[] SEC("license") = #name; \ +int _version SEC("version") = LINUX_VERSION_CODE; + #endif /* _PERF_BPF_H */ -- cgit v1.2.3