From patchwork Sun Sep 6 07:13:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 53190 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f200.google.com (mail-lb0-f200.google.com [209.85.217.200]) by patches.linaro.org (Postfix) with ESMTPS id 499EE22B05 for ; Sun, 6 Sep 2015 07:19:37 +0000 (UTC) Received: by lbbti1 with SMTP id ti1sf17394990lbb.3 for ; Sun, 06 Sep 2015 00:19:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-type:sender:precedence :list-id:x-original-sender:x-original-authentication-results :mailing-list:list-post:list-help:list-archive:list-unsubscribe; bh=oqds+BYkRah0o1vV3xi7j0+Vm0VJLoLFQ1/xLzv+LIk=; b=No9u0VN0a/sP4XGR1PgBIENoXcltzMWR92HC4YosyEjXgnQNFL+eA4HaZyv+YHUC+s H+4A5YOPMpj27D71LOxEuriaQm0/IhtSMd/4/BAV5EkRDHVROG6BeW21JwZJOkcOytke yh/j96jMK63Rzm29Tr10mYr6KrYN5euXO6Wfds9Wf8RQWLTa/bFE96QsDC6jH0sIRiAF ydzM9p3VAoEOGUVGfc7tN6vLGaO2nEKUUAHSj6M+sYKi/ayzVzrSg4g1C/coi+yzznxi OSMNt/gPAgHaJrNrW4iptoRvmRmaANMU09sExdt1pPv4rYJyLBlkDfj+Xq8iDm9Rtvki nKIQ== X-Gm-Message-State: ALoCoQn4NJd53AH8wcR+HUbrMQ8DRgYKl/viUyZNFWmb8GAv3gq6u3HefhyYy9MXnqfFA8OEqoUf X-Received: by 10.180.12.203 with SMTP id a11mr3411453wic.3.1441523976269; Sun, 06 Sep 2015 00:19:36 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.43.170 with SMTP id x10ls508053lal.61.gmail; Sun, 06 Sep 2015 00:19:36 -0700 (PDT) X-Received: by 10.112.140.232 with SMTP id rj8mr11318025lbb.2.1441523976074; Sun, 06 Sep 2015 00:19:36 -0700 (PDT) Received: from mail-la0-f52.google.com (mail-la0-f52.google.com. [209.85.215.52]) by mx.google.com with ESMTPS id j10si7213743lbv.162.2015.09.06.00.19.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 06 Sep 2015 00:19:36 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.52 as permitted sender) client-ip=209.85.215.52; Received: by lagj9 with SMTP id j9so35927972lag.2 for ; Sun, 06 Sep 2015 00:19:36 -0700 (PDT) X-Received: by 10.112.198.202 with SMTP id je10mr11701142lbc.86.1441523975872; Sun, 06 Sep 2015 00:19:35 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.164.42 with SMTP id yn10csp844890lbb; Sun, 6 Sep 2015 00:19:34 -0700 (PDT) X-Received: by 10.68.242.42 with SMTP id wn10mr30523605pbc.77.1441523974637; Sun, 06 Sep 2015 00:19:34 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p1si13760093pdr.158.2015.09.06.00.19.33; Sun, 06 Sep 2015 00:19:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753233AbbIFHTb (ORCPT + 28 others); Sun, 6 Sep 2015 03:19:31 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:7324 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751459AbbIFHOn (ORCPT ); Sun, 6 Sep 2015 03:14:43 -0400 Received: from 172.24.1.48 (EHLO SZXEML423-HUB.china.huawei.com) ([172.24.1.48]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CUK94051; Sun, 06 Sep 2015 15:14:15 +0800 (CST) Received: from linux-4hy3.site (10.107.193.248) by SZXEML423-HUB.china.huawei.com (10.82.67.154) with Microsoft SMTP Server id 14.3.235.1; Sun, 6 Sep 2015 15:14:06 +0800 From: Wang Nan To: , , , CC: , , , , , , , , , , , Subject: [PATCH 14/27] perf test: Enforce LLVM test for BPF test Date: Sun, 6 Sep 2015 07:13:30 +0000 Message-ID: <1441523623-152703-15-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1441523623-152703-1-git-send-email-wangnan0@huawei.com> References: <1441523623-152703-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: wangnan0@huawei.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.52 as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , 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: pi3orama@163.com Link: http://lkml.kernel.org/n/1440151770-129878-15-git-send-email-wangnan0@huawei.com [wangnan: - Fix random building error by add $(call rule_mkdir) for tests/llvm-src.c. ] --- tools/perf/tests/Build | 9 +++- tools/perf/tests/builtin-test.c | 8 ++++ tools/perf/tests/llvm.c | 104 +++++++++++++++++++++++++++++++++++----- tools/perf/tests/llvm.h | 14 ++++++ tools/perf/tests/tests.h | 2 + 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 c6f198ae..e80f787 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -32,9 +32,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 ';' >> $@ + perf-$(CONFIG_X86) += perf-time-to-tsc.o ifdef CONFIG_AUXTRACE perf-$(CONFIG_X86) += insn-x86.o diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 98b0b24..ba3cf10 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -17,6 +17,8 @@ static struct test { const char *desc; int (*func)(void); + void (*prepare)(void); + void (*cleanup)(void); } tests[] = { { .desc = "vmlinux symtab matches kallsyms", @@ -177,6 +179,8 @@ static struct test { { .desc = "Test LLVM searching and compiling", .func = test__llvm, + .prepare = test__llvm_prepare, + .cleanup = test__llvm_cleanup, }, #ifdef HAVE_AUXTRACE_SUPPORT #if defined(__x86_64__) || defined(__i386__) @@ -277,7 +281,11 @@ static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) } pr_debug("\n--- start ---\n"); + if (tests[curr].prepare) + tests[curr].prepare(); err = run_test(&tests[curr]); + if (tests[curr].cleanup) + tests[curr].cleanup(); pr_debug("---- end ----\n%s:", tests[curr].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(&utsname)) + return NULL; + + err = sscanf(utsname.release, "%d.%d.%d", + &version, &patchlevel, &sublevel); + 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(&code, "#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) +struct test_llvm__bpf_result *p_test_llvm__bpf_result; + int test__llvm(void) { char *tmpl_new, *clang_opt_new; void *obj_buf; size_t obj_buf_sz; int err, old_verbose; + char *source; perf_config(perf_config_cb, NULL); @@ -73,10 +99,22 @@ int test__llvm(void) if (!llvm_param.clang_opt) llvm_param.clang_opt = strdup(""); - err = asprintf(&tmpl_new, "echo '%s' | %s", test_bpf_prog, - llvm_param.clang_bpf_cmd_template); - if (err < 0) + source = compose_source(); + if (!source) { + pr_err("Failed to compose source code\n"); + return -1; + } + + /* Quote __EOF__ so strings in source won't be expanded by shell */ + err = asprintf(&tmpl_new, "cat << '__EOF__' | %s\n%s\n__EOF__\n", + llvm_param.clang_bpf_cmd_template, source); + free(source); + source = NULL; + if (err < 0) { + pr_err("Failed to alloc new template\n"); return -1; + } + err = asprintf(&clang_opt_new, "-xc %s", llvm_param.clang_opt); if (err < 0) return -1; @@ -93,6 +131,46 @@ int test__llvm(void) } err = test__bpf_parsing(obj_buf, obj_buf_sz); + if (!err && p_test_llvm__bpf_result) { + if (obj_buf_sz > SHARED_BUF_INIT_SIZE) { + pr_err("Resulting object too large\n"); + } else { + p_test_llvm__bpf_result->size = obj_buf_sz; + memcpy(p_test_llvm__bpf_result->object, + obj_buf, obj_buf_sz); + } + } free(obj_buf); return err; } + +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) + 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) + 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 0000000..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 0b35496..a5e6f641 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -63,6 +63,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__insn_x86(void); int test_session_topology(void);