Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/11/4 2:24, Arnaldo Carvalho de Melo wrote: Em Thu, Oct 15, 2015 at 07:58:38PM +0800, Wangnan (F) escreveu: +void test__llvm_prepare(void) +{ + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. Fixed by this way: Can you please try refreshing this patchset on top of what is now in acme/perf/core? Also why do we need those struct test->{prepare,cleanup} pointers? You introduced it and then, on the next patch that touches 'perf test' and uses test__llvm_{prepare,cleanup} you call them directly, which I think should be enough, i.e. keep them as functions to call from inside the test called from run_test(), right? - Arnaldo This prepare/cleanup functions are introduced because I want BPF test reuse the result of LLVM test, so it don't need to compile those BPF scripts twice. This is the reason I use shared memory. However, now I think compiling twice is acceptable and can make things simpler. I'll update this patchset in my next pull request. Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
Em Thu, Oct 15, 2015 at 07:58:38PM +0800, Wangnan (F) escreveu: > >>+void test__llvm_prepare(void) > >>+{ > >>+ p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, > >>+ PROT_READ | PROT_WRITE, > >>+ MAP_SHARED | MAP_ANONYMOUS, -1, 0); > >>+ if (!p_test_llvm__bpf_result) > >It should check MAP_FAILED instead. > > > > Fixed by this way: Can you please try refreshing this patchset on top of what is now in acme/perf/core? Also why do we need those struct test->{prepare,cleanup} pointers? You introduced it and then, on the next patch that touches 'perf test' and uses test__llvm_{prepare,cleanup} you call them directly, which I think should be enough, i.e. keep them as functions to call from inside the test called from run_test(), right? - Arnaldo > diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c > index e722e8a..25ddeaf 100644 > --- a/tools/perf/tests/llvm.c > +++ b/tools/perf/tests/llvm.c > @@ -199,12 +199,15 @@ void test__llvm_prepare(void) > > for (i = 0; llvm_testcases[i].source; i++) { > struct test_llvm__bpf_result *result; > + void *p; > > - result = mmap(NULL, SHARED_BUF_INIT_SIZE, > - PROT_READ | PROT_WRITE, > - MAP_SHARED | MAP_ANONYMOUS, -1, 0); > - if (!result) > + p = mmap(NULL, SHARED_BUF_INIT_SIZE, > +PROT_READ | PROT_WRITE, > +MAP_SHARED | MAP_ANONYMOUS, -1, 0); > + if (p == MAP_FAILED) > return; > + > + result = p; > memset((void *)result, '\0', SHARED_BUF_INIT_SIZE); > > llvm_testcases[i].result = result; > > Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
Em Thu, Oct 15, 2015 at 07:58:38PM +0800, Wangnan (F) escreveu: > >>+void test__llvm_prepare(void) > >>+{ > >>+ p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, > >>+ PROT_READ | PROT_WRITE, > >>+ MAP_SHARED | MAP_ANONYMOUS, -1, 0); > >>+ if (!p_test_llvm__bpf_result) > >It should check MAP_FAILED instead. > > > > Fixed by this way: Can you please try refreshing this patchset on top of what is now in acme/perf/core? Also why do we need those struct test->{prepare,cleanup} pointers? You introduced it and then, on the next patch that touches 'perf test' and uses test__llvm_{prepare,cleanup} you call them directly, which I think should be enough, i.e. keep them as functions to call from inside the test called from run_test(), right? - Arnaldo > diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c > index e722e8a..25ddeaf 100644 > --- a/tools/perf/tests/llvm.c > +++ b/tools/perf/tests/llvm.c > @@ -199,12 +199,15 @@ void test__llvm_prepare(void) > > for (i = 0; llvm_testcases[i].source; i++) { > struct test_llvm__bpf_result *result; > + void *p; > > - result = mmap(NULL, SHARED_BUF_INIT_SIZE, > - PROT_READ | PROT_WRITE, > - MAP_SHARED | MAP_ANONYMOUS, -1, 0); > - if (!result) > + p = mmap(NULL, SHARED_BUF_INIT_SIZE, > +PROT_READ | PROT_WRITE, > +MAP_SHARED | MAP_ANONYMOUS, -1, 0); > + if (p == MAP_FAILED) > return; > + > + result = p; > memset((void *)result, '\0', SHARED_BUF_INIT_SIZE); > > llvm_testcases[i].result = result; > > Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/11/4 2:24, Arnaldo Carvalho de Melo wrote: Em Thu, Oct 15, 2015 at 07:58:38PM +0800, Wangnan (F) escreveu: +void test__llvm_prepare(void) +{ + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. Fixed by this way: Can you please try refreshing this patchset on top of what is now in acme/perf/core? Also why do we need those struct test->{prepare,cleanup} pointers? You introduced it and then, on the next patch that touches 'perf test' and uses test__llvm_{prepare,cleanup} you call them directly, which I think should be enough, i.e. keep them as functions to call from inside the test called from run_test(), right? - Arnaldo This prepare/cleanup functions are introduced because I want BPF test reuse the result of LLVM test, so it don't need to compile those BPF scripts twice. This is the reason I use shared memory. However, now I think compiling twice is acceptable and can make things simpler. I'll update this patchset in my next pull request. Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/10/30 6:37, Arnaldo Carvalho de Melo wrote: Em Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan escreveu: This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never "collect half samples from it"? Can you rephrase this? I mean half of epoll_pwait syscall will be captured. This test case totally issue 111 calls. Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/10/30 6:37, Arnaldo Carvalho de Melo wrote: Em Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan escreveu: This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never "collect half samples from it"? Can you rephrase this? I mean half of epoll_pwait syscall will be captured. This test case totally issue 111 calls. Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
Em Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan escreveu: > This patch replaces the original toy BPF program with previous introduced > bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. > > The newly introduced BPF program attaches a BPF program at > 'sys_epoll_pwait()', and collect half samples from it. perf itself never "collect half samples from it"? Can you rephrase this? > use that syscall, so further test can verify their result with it. > > Since BPF program require LINUX_VERSION_CODE of runtime kernel, this > patch computes that code from uname. > > Since the resuling BPF object is useful for further testcases, this patch > introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() > create a MAP_SHARED memory array to hold the resulting object. I think you're doing lots of things in just one patch, please split it, for instance, that ->prepare()/->cleanup() should stand on its own, with a proper changelog, etc. The LINUX_VERSION_CODE part should probably also be on its own patch, working much like __FILE__ or __func__, i.e. gcc predefines those, the bpf code that calls clang to build the provided .c file should do the same for LINUX_VERSION_CODE, so that bpf scriptlets can rely on it being defined. I.e. that compose_source() function, but not just for the 'perf test' entry, for any bpf scriptlet. > Signed-off-by: He Kuang > Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo > Cc: Alexei Starovoitov > Cc: Brendan Gregg > Cc: Daniel Borkmann > Cc: David Ahern > Cc: Jiri Olsa > Cc: Kaixu Xia > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Peter Zijlstra > Cc: Zefan Li > Cc: pi3or...@163.com > Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org > --- > tools/perf/tests/Build | 9 +++- > tools/perf/tests/builtin-test.c | 6 +++ > tools/perf/tests/llvm.c | 104 > +++- > tools/perf/tests/llvm.h | 14 ++ > tools/perf/tests/tests.h| 4 ++ > 5 files changed, 123 insertions(+), 14 deletions(-) > create mode 100644 tools/perf/tests/llvm.h > > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build > index 50de225..4afc8c8 100644 > --- a/tools/perf/tests/Build > +++ b/tools/perf/tests/Build > @@ -31,9 +31,16 @@ perf-y += sample-parsing.o > perf-y += parse-no-sample-id-all.o > perf-y += kmod-path.o > perf-y += thread-map.o > -perf-y += llvm.o > +perf-y += llvm.o llvm-src.o > perf-y += topology.o > > +$(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c > + $(call rule_mkdir) > + $(Q)echo '#include ' > $@ > + $(Q)echo 'const char test_llvm__bpf_prog[] =' >> $@ > + $(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@ > + $(Q)echo ';' >> $@ > + > ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64)) > perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o > endif > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c > index 66f72d3..e812a0c 100644 > --- a/tools/perf/tests/builtin-test.c > +++ b/tools/perf/tests/builtin-test.c > @@ -160,6 +160,8 @@ static struct test generic_tests[] = { > { > .desc = "Test LLVM searching and compiling", > .func = test__llvm, > + .prepare = test__llvm_prepare, > + .cleanup = test__llvm_cleanup, > }, > { > .desc = "Test topology in session", > @@ -261,7 +263,11 @@ static int __cmd_test(int argc, const char *argv[], > struct intlist *skiplist) > } > > pr_debug("\n--- start ---\n"); > + if (t->prepare) > + t->prepare(); > err = run_test(t); > + if (t->cleanup) > + t->cleanup(); > pr_debug(" end \n%s:", t->desc); > > switch (err) { > diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c > index 52d5597..236bf39 100644 > --- a/tools/perf/tests/llvm.c > +++ b/tools/perf/tests/llvm.c > @@ -1,9 +1,13 @@ > #include > +#include > #include > #include > #include > +#include > +#include > #include "tests.h" > #include "debug.h" > +#include "llvm.h" > > static int perf_config_cb(const char *var, const char *val, > void *arg __maybe_unused) > @@ -11,16 +15,6 @@ static int perf_config_cb(const char *var, const char *val, > return perf_default_config(var, val, arg); > } > > -/* > - * Randomly give it a "version" section since we don't really load it > - * into kernel > - */ > -static const char test_bpf_prog[] = > - "__attribute__((section(\"do_fork\"), used)) " > - "int fork(void *ctx) {return 0;} " > - "char _license[] __attribute__((section(\"license\"), used)) = \"GPL\";" > - "int _version __attribute__((section(\"version\"), used)) = 0x40100;"; > - > #ifdef HAVE_LIBBPF_SUPPORT > static int test__bpf_parsing(void *obj_buf, size_t obj_buf_sz) > { > @@ -41,12 +35,44 @@ static int
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
Em Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan escreveu: > This patch replaces the original toy BPF program with previous introduced > bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. > > The newly introduced BPF program attaches a BPF program at > 'sys_epoll_pwait()', and collect half samples from it. perf itself never "collect half samples from it"? Can you rephrase this? > use that syscall, so further test can verify their result with it. > > Since BPF program require LINUX_VERSION_CODE of runtime kernel, this > patch computes that code from uname. > > Since the resuling BPF object is useful for further testcases, this patch > introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() > create a MAP_SHARED memory array to hold the resulting object. I think you're doing lots of things in just one patch, please split it, for instance, that ->prepare()/->cleanup() should stand on its own, with a proper changelog, etc. The LINUX_VERSION_CODE part should probably also be on its own patch, working much like __FILE__ or __func__, i.e. gcc predefines those, the bpf code that calls clang to build the provided .c file should do the same for LINUX_VERSION_CODE, so that bpf scriptlets can rely on it being defined. I.e. that compose_source() function, but not just for the 'perf test' entry, for any bpf scriptlet. > Signed-off-by: He Kuang> Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo > Cc: Alexei Starovoitov > Cc: Brendan Gregg > Cc: Daniel Borkmann > Cc: David Ahern > Cc: Jiri Olsa > Cc: Kaixu Xia > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Peter Zijlstra > Cc: Zefan Li > Cc: pi3or...@163.com > Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org > --- > tools/perf/tests/Build | 9 +++- > tools/perf/tests/builtin-test.c | 6 +++ > tools/perf/tests/llvm.c | 104 > +++- > tools/perf/tests/llvm.h | 14 ++ > tools/perf/tests/tests.h| 4 ++ > 5 files changed, 123 insertions(+), 14 deletions(-) > create mode 100644 tools/perf/tests/llvm.h > > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build > index 50de225..4afc8c8 100644 > --- a/tools/perf/tests/Build > +++ b/tools/perf/tests/Build > @@ -31,9 +31,16 @@ perf-y += sample-parsing.o > perf-y += parse-no-sample-id-all.o > perf-y += kmod-path.o > perf-y += thread-map.o > -perf-y += llvm.o > +perf-y += llvm.o llvm-src.o > perf-y += topology.o > > +$(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c > + $(call rule_mkdir) > + $(Q)echo '#include ' > $@ > + $(Q)echo 'const char test_llvm__bpf_prog[] =' >> $@ > + $(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@ > + $(Q)echo ';' >> $@ > + > ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64)) > perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o > endif > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c > index 66f72d3..e812a0c 100644 > --- a/tools/perf/tests/builtin-test.c > +++ b/tools/perf/tests/builtin-test.c > @@ -160,6 +160,8 @@ static struct test generic_tests[] = { > { > .desc = "Test LLVM searching and compiling", > .func = test__llvm, > + .prepare = test__llvm_prepare, > + .cleanup = test__llvm_cleanup, > }, > { > .desc = "Test topology in session", > @@ -261,7 +263,11 @@ static int __cmd_test(int argc, const char *argv[], > struct intlist *skiplist) > } > > pr_debug("\n--- start ---\n"); > + if (t->prepare) > + t->prepare(); > err = run_test(t); > + if (t->cleanup) > + t->cleanup(); > pr_debug(" end \n%s:", t->desc); > > switch (err) { > diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c > index 52d5597..236bf39 100644 > --- a/tools/perf/tests/llvm.c > +++ b/tools/perf/tests/llvm.c > @@ -1,9 +1,13 @@ > #include > +#include > #include > #include > #include > +#include > +#include > #include "tests.h" > #include "debug.h" > +#include "llvm.h" > > static int perf_config_cb(const char *var, const char *val, > void *arg __maybe_unused) > @@ -11,16 +15,6 @@ static int perf_config_cb(const char *var, const char *val, > return perf_default_config(var, val, arg); > } > > -/* > - * Randomly give it a "version" section since we don't really load it > - * into kernel > - */ > -static const char test_bpf_prog[] = > - "__attribute__((section(\"do_fork\"), used)) " > - "int fork(void *ctx) {return 0;} " > - "char
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/10/14 23:48, Namhyung Kim wrote: On Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan wrote: This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never use that syscall, so further test can verify their result with it. Since BPF program require LINUX_VERSION_CODE of runtime kernel, this patch computes that code from uname. Since the resuling BPF object is useful for further testcases, this patch introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() create a MAP_SHARED memory array to hold the resulting object. Signed-off-by: He Kuang Signed-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Cc: pi3or...@163.com Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org --- [SNIP] +void test__llvm_prepare(void) +{ + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. Fixed by this way: diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c index e722e8a..25ddeaf 100644 --- a/tools/perf/tests/llvm.c +++ b/tools/perf/tests/llvm.c @@ -199,12 +199,15 @@ void test__llvm_prepare(void) for (i = 0; llvm_testcases[i].source; i++) { struct test_llvm__bpf_result *result; + void *p; - result = mmap(NULL, SHARED_BUF_INIT_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANONYMOUS, -1, 0); - if (!result) + p = mmap(NULL, SHARED_BUF_INIT_SIZE, +PROT_READ | PROT_WRITE, +MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (p == MAP_FAILED) return; + + result = p; memset((void *)result, '\0', SHARED_BUF_INIT_SIZE); llvm_testcases[i].result = result; Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On 2015/10/14 23:48, Namhyung Kim wrote: On Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan wrote: This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never use that syscall, so further test can verify their result with it. Since BPF program require LINUX_VERSION_CODE of runtime kernel, this patch computes that code from uname. Since the resuling BPF object is useful for further testcases, this patch introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() create a MAP_SHARED memory array to hold the resulting object. Signed-off-by: He KuangSigned-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Cc: pi3or...@163.com Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org --- [SNIP] +void test__llvm_prepare(void) +{ + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. Fixed by this way: diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c index e722e8a..25ddeaf 100644 --- a/tools/perf/tests/llvm.c +++ b/tools/perf/tests/llvm.c @@ -199,12 +199,15 @@ void test__llvm_prepare(void) for (i = 0; llvm_testcases[i].source; i++) { struct test_llvm__bpf_result *result; + void *p; - result = mmap(NULL, SHARED_BUF_INIT_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANONYMOUS, -1, 0); - if (!result) + p = mmap(NULL, SHARED_BUF_INIT_SIZE, +PROT_READ | PROT_WRITE, +MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (p == MAP_FAILED) return; + + result = p; memset((void *)result, '\0', SHARED_BUF_INIT_SIZE); llvm_testcases[i].result = result; Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan wrote: > This patch replaces the original toy BPF program with previous introduced > bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. > > The newly introduced BPF program attaches a BPF program at > 'sys_epoll_pwait()', and collect half samples from it. perf itself never > use that syscall, so further test can verify their result with it. > > Since BPF program require LINUX_VERSION_CODE of runtime kernel, this > patch computes that code from uname. > > Since the resuling BPF object is useful for further testcases, this patch > introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() > create a MAP_SHARED memory array to hold the resulting object. > > Signed-off-by: He Kuang > Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo > Cc: Alexei Starovoitov > Cc: Brendan Gregg > Cc: Daniel Borkmann > Cc: David Ahern > Cc: Jiri Olsa > Cc: Kaixu Xia > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Peter Zijlstra > Cc: Zefan Li > Cc: pi3or...@163.com > Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org > --- [SNIP] > +void test__llvm_prepare(void) > +{ > + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, > +PROT_READ | PROT_WRITE, > +MAP_SHARED | MAP_ANONYMOUS, -1, 0); > + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. > + return; > + memset((void *)p_test_llvm__bpf_result, '\0', SHARED_BUF_INIT_SIZE); > +} > + > +void test__llvm_cleanup(void) > +{ > + unsigned long boundary, buf_end; > + > + if (!p_test_llvm__bpf_result) Ditto. Thanks, Namhyung > + return; > + if (p_test_llvm__bpf_result->size == 0) { > + munmap((void *)p_test_llvm__bpf_result, SHARED_BUF_INIT_SIZE); > + p_test_llvm__bpf_result = NULL; > + return; > + } > + > + buf_end = (unsigned long)p_test_llvm__bpf_result + SHARED_BUF_INIT_SIZE; > + > + boundary = (unsigned long)(p_test_llvm__bpf_result); > + boundary += p_test_llvm__bpf_result->size; > + boundary = (boundary + (page_size - 1)) & > + (~((unsigned long)page_size - 1)); > + munmap((void *)boundary, buf_end - boundary); > +} > diff --git a/tools/perf/tests/llvm.h b/tools/perf/tests/llvm.h > new file mode 100644 > index 000..1e89e46 > --- /dev/null > +++ b/tools/perf/tests/llvm.h > @@ -0,0 +1,14 @@ > +#ifndef PERF_TEST_LLVM_H > +#define PERF_TEST_LLVM_H > + > +#include /* for size_t */ > + > +struct test_llvm__bpf_result { > + size_t size; > + char object[]; > +}; > + > +extern struct test_llvm__bpf_result *p_test_llvm__bpf_result; > +extern const char test_llvm__bpf_prog[]; > + > +#endif > diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h > index c804869..a848802 100644 > --- a/tools/perf/tests/tests.h > +++ b/tools/perf/tests/tests.h > @@ -27,6 +27,8 @@ enum { > struct test { > const char *desc; > int (*func)(void); > + void (*prepare)(void); > + void (*cleanup)(void); > }; > > /* Tests */ > @@ -66,6 +68,8 @@ int test__fdarray__add(void); > int test__kmod_path__parse(void); > int test__thread_map(void); > int test__llvm(void); > +void test__llvm_prepare(void); > +void test__llvm_cleanup(void); > int test_session_topology(void); > > #if defined(__arm__) || defined(__aarch64__) > -- > 1.8.3.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 10/31] perf test: Enforce LLVM test for BPF test
This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never use that syscall, so further test can verify their result with it. Since BPF program require LINUX_VERSION_CODE of runtime kernel, this patch computes that code from uname. Since the resuling BPF object is useful for further testcases, this patch introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() create a MAP_SHARED memory array to hold the resulting object. Signed-off-by: He Kuang Signed-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Cc: pi3or...@163.com Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org --- tools/perf/tests/Build | 9 +++- tools/perf/tests/builtin-test.c | 6 +++ tools/perf/tests/llvm.c | 104 +++- tools/perf/tests/llvm.h | 14 ++ tools/perf/tests/tests.h| 4 ++ 5 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 tools/perf/tests/llvm.h diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index 50de225..4afc8c8 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -31,9 +31,16 @@ perf-y += sample-parsing.o perf-y += parse-no-sample-id-all.o perf-y += kmod-path.o perf-y += thread-map.o -perf-y += llvm.o +perf-y += llvm.o llvm-src.o perf-y += topology.o +$(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c + $(call rule_mkdir) + $(Q)echo '#include ' > $@ + $(Q)echo 'const char test_llvm__bpf_prog[] =' >> $@ + $(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@ + $(Q)echo ';' >> $@ + ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64)) perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o endif diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 66f72d3..e812a0c 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -160,6 +160,8 @@ static struct test generic_tests[] = { { .desc = "Test LLVM searching and compiling", .func = test__llvm, + .prepare = test__llvm_prepare, + .cleanup = test__llvm_cleanup, }, { .desc = "Test topology in session", @@ -261,7 +263,11 @@ static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) } pr_debug("\n--- start ---\n"); + if (t->prepare) + t->prepare(); err = run_test(t); + if (t->cleanup) + t->cleanup(); pr_debug(" end \n%s:", t->desc); switch (err) { diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c index 52d5597..236bf39 100644 --- a/tools/perf/tests/llvm.c +++ b/tools/perf/tests/llvm.c @@ -1,9 +1,13 @@ #include +#include #include #include #include +#include +#include #include "tests.h" #include "debug.h" +#include "llvm.h" static int perf_config_cb(const char *var, const char *val, void *arg __maybe_unused) @@ -11,16 +15,6 @@ static int perf_config_cb(const char *var, const char *val, return perf_default_config(var, val, arg); } -/* - * Randomly give it a "version" section since we don't really load it - * into kernel - */ -static const char test_bpf_prog[] = - "__attribute__((section(\"do_fork\"), used)) " - "int fork(void *ctx) {return 0;} " - "char _license[] __attribute__((section(\"license\"), used)) = \"GPL\";" - "int _version __attribute__((section(\"version\"), used)) = 0x40100;"; - #ifdef HAVE_LIBBPF_SUPPORT static int test__bpf_parsing(void *obj_buf, size_t obj_buf_sz) { @@ -41,12 +35,44 @@ static int test__bpf_parsing(void *obj_buf __maybe_unused, } #endif +static char * +compose_source(void) +{ + struct utsname utsname; + int version, patchlevel, sublevel, err; + unsigned long version_code; + char *code; + + if (uname()) + return NULL; + + err = sscanf(utsname.release, "%d.%d.%d", +, , ); + if (err != 3) { + fprintf(stderr, " (Can't get kernel version from uname '%s')", + utsname.release); + return NULL; + } + + version_code = (version << 16) + (patchlevel << 8) + sublevel; + err = asprintf(, "#define LINUX_VERSION_CODE 0x%08lx;\n%s", + version_code, test_llvm__bpf_prog); + if (err < 0) + return NULL; + + return code; +} + +#define SHARED_BUF_INIT_SIZE (1 << 20)
Re: [PATCH 10/31] perf test: Enforce LLVM test for BPF test
On Wed, Oct 14, 2015 at 12:41:21PM +, Wang Nan wrote: > This patch replaces the original toy BPF program with previous introduced > bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. > > The newly introduced BPF program attaches a BPF program at > 'sys_epoll_pwait()', and collect half samples from it. perf itself never > use that syscall, so further test can verify their result with it. > > Since BPF program require LINUX_VERSION_CODE of runtime kernel, this > patch computes that code from uname. > > Since the resuling BPF object is useful for further testcases, this patch > introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() > create a MAP_SHARED memory array to hold the resulting object. > > Signed-off-by: He Kuang> Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo > Cc: Alexei Starovoitov > Cc: Brendan Gregg > Cc: Daniel Borkmann > Cc: David Ahern > Cc: Jiri Olsa > Cc: Kaixu Xia > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Peter Zijlstra > Cc: Zefan Li > Cc: pi3or...@163.com > Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org > --- [SNIP] > +void test__llvm_prepare(void) > +{ > + p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE, > +PROT_READ | PROT_WRITE, > +MAP_SHARED | MAP_ANONYMOUS, -1, 0); > + if (!p_test_llvm__bpf_result) It should check MAP_FAILED instead. > + return; > + memset((void *)p_test_llvm__bpf_result, '\0', SHARED_BUF_INIT_SIZE); > +} > + > +void test__llvm_cleanup(void) > +{ > + unsigned long boundary, buf_end; > + > + if (!p_test_llvm__bpf_result) Ditto. Thanks, Namhyung > + return; > + if (p_test_llvm__bpf_result->size == 0) { > + munmap((void *)p_test_llvm__bpf_result, SHARED_BUF_INIT_SIZE); > + p_test_llvm__bpf_result = NULL; > + return; > + } > + > + buf_end = (unsigned long)p_test_llvm__bpf_result + SHARED_BUF_INIT_SIZE; > + > + boundary = (unsigned long)(p_test_llvm__bpf_result); > + boundary += p_test_llvm__bpf_result->size; > + boundary = (boundary + (page_size - 1)) & > + (~((unsigned long)page_size - 1)); > + munmap((void *)boundary, buf_end - boundary); > +} > diff --git a/tools/perf/tests/llvm.h b/tools/perf/tests/llvm.h > new file mode 100644 > index 000..1e89e46 > --- /dev/null > +++ b/tools/perf/tests/llvm.h > @@ -0,0 +1,14 @@ > +#ifndef PERF_TEST_LLVM_H > +#define PERF_TEST_LLVM_H > + > +#include /* for size_t */ > + > +struct test_llvm__bpf_result { > + size_t size; > + char object[]; > +}; > + > +extern struct test_llvm__bpf_result *p_test_llvm__bpf_result; > +extern const char test_llvm__bpf_prog[]; > + > +#endif > diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h > index c804869..a848802 100644 > --- a/tools/perf/tests/tests.h > +++ b/tools/perf/tests/tests.h > @@ -27,6 +27,8 @@ enum { > struct test { > const char *desc; > int (*func)(void); > + void (*prepare)(void); > + void (*cleanup)(void); > }; > > /* Tests */ > @@ -66,6 +68,8 @@ int test__fdarray__add(void); > int test__kmod_path__parse(void); > int test__thread_map(void); > int test__llvm(void); > +void test__llvm_prepare(void); > +void test__llvm_cleanup(void); > int test_session_topology(void); > > #if defined(__arm__) || defined(__aarch64__) > -- > 1.8.3.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 10/31] perf test: Enforce LLVM test for BPF test
This patch replaces the original toy BPF program with previous introduced bpf-script-example.c. Dynamically embedded it into 'llvm-src.c'. The newly introduced BPF program attaches a BPF program at 'sys_epoll_pwait()', and collect half samples from it. perf itself never use that syscall, so further test can verify their result with it. Since BPF program require LINUX_VERSION_CODE of runtime kernel, this patch computes that code from uname. Since the resuling BPF object is useful for further testcases, this patch introduces 'prepare' and 'cleanup' method to tests, and makes test__llvm() create a MAP_SHARED memory array to hold the resulting object. Signed-off-by: He KuangSigned-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Cc: pi3or...@163.com Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngk...@git.kernel.org --- tools/perf/tests/Build | 9 +++- tools/perf/tests/builtin-test.c | 6 +++ tools/perf/tests/llvm.c | 104 +++- tools/perf/tests/llvm.h | 14 ++ tools/perf/tests/tests.h| 4 ++ 5 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 tools/perf/tests/llvm.h diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index 50de225..4afc8c8 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -31,9 +31,16 @@ perf-y += sample-parsing.o perf-y += parse-no-sample-id-all.o perf-y += kmod-path.o perf-y += thread-map.o -perf-y += llvm.o +perf-y += llvm.o llvm-src.o perf-y += topology.o +$(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c + $(call rule_mkdir) + $(Q)echo '#include ' > $@ + $(Q)echo 'const char test_llvm__bpf_prog[] =' >> $@ + $(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@ + $(Q)echo ';' >> $@ + ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64)) perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o endif diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 66f72d3..e812a0c 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -160,6 +160,8 @@ static struct test generic_tests[] = { { .desc = "Test LLVM searching and compiling", .func = test__llvm, + .prepare = test__llvm_prepare, + .cleanup = test__llvm_cleanup, }, { .desc = "Test topology in session", @@ -261,7 +263,11 @@ static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) } pr_debug("\n--- start ---\n"); + if (t->prepare) + t->prepare(); err = run_test(t); + if (t->cleanup) + t->cleanup(); pr_debug(" end \n%s:", t->desc); switch (err) { diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c index 52d5597..236bf39 100644 --- a/tools/perf/tests/llvm.c +++ b/tools/perf/tests/llvm.c @@ -1,9 +1,13 @@ #include +#include #include #include #include +#include +#include #include "tests.h" #include "debug.h" +#include "llvm.h" static int perf_config_cb(const char *var, const char *val, void *arg __maybe_unused) @@ -11,16 +15,6 @@ static int perf_config_cb(const char *var, const char *val, return perf_default_config(var, val, arg); } -/* - * Randomly give it a "version" section since we don't really load it - * into kernel - */ -static const char test_bpf_prog[] = - "__attribute__((section(\"do_fork\"), used)) " - "int fork(void *ctx) {return 0;} " - "char _license[] __attribute__((section(\"license\"), used)) = \"GPL\";" - "int _version __attribute__((section(\"version\"), used)) = 0x40100;"; - #ifdef HAVE_LIBBPF_SUPPORT static int test__bpf_parsing(void *obj_buf, size_t obj_buf_sz) { @@ -41,12 +35,44 @@ static int test__bpf_parsing(void *obj_buf __maybe_unused, } #endif +static char * +compose_source(void) +{ + struct utsname utsname; + int version, patchlevel, sublevel, err; + unsigned long version_code; + char *code; + + if (uname()) + return NULL; + + err = sscanf(utsname.release, "%d.%d.%d", +, , ); + if (err != 3) { + fprintf(stderr, " (Can't get kernel version from uname '%s')", + utsname.release); + return NULL; + } + + version_code = (version <<