mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: tip-bot for Wang Nan <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: brendan.d.gregg@gmail.com, peterz@infradead.org,
	jolsa@kernel.org, lizefan@huawei.com,
	masami.hiramatsu.pt@hitachi.com, ast@kernel.org,
	tglx@linutronix.de, hpa@zytor.com, hekuang@huawei.com,
	will.deacon@arm.com, acme@redhat.com, daniel@iogearbox.net,
	wangnan0@huawei.com, linux-kernel@vger.kernel.org,
	namhyung@kernel.org, mingo@kernel.org
Subject: [tip:perf/core] perf test: Improve bp_signal
Date: Wed, 3 Feb 2016 02:18:32 -0800	[thread overview]
Message-ID: <tip-8fd34e1cce180eb0c726e7ed88f7b70c11c38e21@git.kernel.org> (raw)
In-Reply-To: <1453715801-7732-9-git-send-email-wangnan0@huawei.com>

Commit-ID:  8fd34e1cce180eb0c726e7ed88f7b70c11c38e21
Gitweb:     http://git.kernel.org/tip/8fd34e1cce180eb0c726e7ed88f7b70c11c38e21
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Mon, 25 Jan 2016 09:55:55 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 29 Jan 2016 17:28:46 -0300

perf test: Improve bp_signal

Will Deacon [1] has some question on patch [2]. This patch improves
test__bp_signal so we can test:

 1. A watchpoint and a breakpoint that fire on the same instruction
 2. Nested signals

Test result:

 On x86_64 and ARM64 (result are similar with patch [2] on ARM64):

  # ./perf test -v signal
  17: Test breakpoint overflow signal handler                  :
  --- start ---
  test child forked, pid 10213
  count1 1, count2 3, count3 2, overflow 3, overflows_2 3
  test child finished with 0
  ---- end ----
  Test breakpoint overflow signal handler: Ok

So at least 2 cases Will doubted are handled correctly.

[1] http://lkml.kernel.org/g/20160104165535.GI1616@arm.com
[2] http://lkml.kernel.org/g/1450921362-198371-1-git-send-email-wangnan0@huawei.com

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: He Kuang <hekuang@huawei.com>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1453715801-7732-9-git-send-email-wangnan0@huawei.com
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/tests/bp_signal.c | 140 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 118 insertions(+), 22 deletions(-)

diff --git a/tools/perf/tests/bp_signal.c b/tools/perf/tests/bp_signal.c
index fb80c9e..1d1bb48 100644
--- a/tools/perf/tests/bp_signal.c
+++ b/tools/perf/tests/bp_signal.c
@@ -29,14 +29,59 @@
 
 static int fd1;
 static int fd2;
+static int fd3;
 static int overflows;
+static int overflows_2;
+
+volatile long the_var;
+
+
+/*
+ * Use ASM to ensure watchpoint and breakpoint can be triggered
+ * at one instruction.
+ */
+#if defined (__x86_64__)
+extern void __test_function(volatile long *ptr);
+asm (
+	".globl __test_function\n"
+	"__test_function:\n"
+	"incq (%rdi)\n"
+	"ret\n");
+#elif defined (__aarch64__)
+extern void __test_function(volatile long *ptr);
+asm (
+	".globl __test_function\n"
+	"__test_function:\n"
+	"str x30, [x0]\n"
+	"ret\n");
+
+#else
+static void __test_function(volatile long *ptr)
+{
+	*ptr = 0x1234;
+}
+#endif
 
 __attribute__ ((noinline))
 static int test_function(void)
 {
+	__test_function(&the_var);
+	the_var++;
 	return time(NULL);
 }
 
+static void sig_handler_2(int signum __maybe_unused,
+			  siginfo_t *oh __maybe_unused,
+			  void *uc __maybe_unused)
+{
+	overflows_2++;
+	if (overflows_2 > 10) {
+		ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
+		ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
+		ioctl(fd3, PERF_EVENT_IOC_DISABLE, 0);
+	}
+}
+
 static void sig_handler(int signum __maybe_unused,
 			siginfo_t *oh __maybe_unused,
 			void *uc __maybe_unused)
@@ -54,10 +99,11 @@ static void sig_handler(int signum __maybe_unused,
 		 */
 		ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
 		ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
+		ioctl(fd3, PERF_EVENT_IOC_DISABLE, 0);
 	}
 }
 
-static int bp_event(void *fn, int setup_signal)
+static int __event(bool is_x, void *addr, int signal)
 {
 	struct perf_event_attr pe;
 	int fd;
@@ -67,8 +113,8 @@ static int bp_event(void *fn, int setup_signal)
 	pe.size = sizeof(struct perf_event_attr);
 
 	pe.config = 0;
-	pe.bp_type = HW_BREAKPOINT_X;
-	pe.bp_addr = (unsigned long) fn;
+	pe.bp_type = is_x ? HW_BREAKPOINT_X : HW_BREAKPOINT_W;
+	pe.bp_addr = (unsigned long) addr;
 	pe.bp_len = sizeof(long);
 
 	pe.sample_period = 1;
@@ -86,17 +132,25 @@ static int bp_event(void *fn, int setup_signal)
 		return TEST_FAIL;
 	}
 
-	if (setup_signal) {
-		fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC);
-		fcntl(fd, F_SETSIG, SIGIO);
-		fcntl(fd, F_SETOWN, getpid());
-	}
+	fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC);
+	fcntl(fd, F_SETSIG, signal);
+	fcntl(fd, F_SETOWN, getpid());
 
 	ioctl(fd, PERF_EVENT_IOC_RESET, 0);
 
 	return fd;
 }
 
+static int bp_event(void *addr, int signal)
+{
+	return __event(true, addr, signal);
+}
+
+static int wp_event(void *addr, int signal)
+{
+	return __event(false, addr, signal);
+}
+
 static long long bp_count(int fd)
 {
 	long long count;
@@ -114,7 +168,7 @@ static long long bp_count(int fd)
 int test__bp_signal(int subtest __maybe_unused)
 {
 	struct sigaction sa;
-	long long count1, count2;
+	long long count1, count2, count3;
 
 	/* setup SIGIO signal handler */
 	memset(&sa, 0, sizeof(struct sigaction));
@@ -126,21 +180,52 @@ int test__bp_signal(int subtest __maybe_unused)
 		return TEST_FAIL;
 	}
 
+	sa.sa_sigaction = (void *) sig_handler_2;
+	if (sigaction(SIGUSR1, &sa, NULL) < 0) {
+		pr_debug("failed setting up signal handler 2\n");
+		return TEST_FAIL;
+	}
+
 	/*
 	 * We create following events:
 	 *
-	 * fd1 - breakpoint event on test_function with SIGIO
+	 * fd1 - breakpoint event on __test_function with SIGIO
 	 *       signal configured. We should get signal
 	 *       notification each time the breakpoint is hit
 	 *
-	 * fd2 - breakpoint event on sig_handler without SIGIO
+	 * fd2 - breakpoint event on sig_handler with SIGUSR1
+	 *       configured. We should get SIGUSR1 each time when
+	 *       breakpoint is hit
+	 *
+	 * fd3 - watchpoint event on __test_function with SIGIO
 	 *       configured.
 	 *
 	 * Following processing should happen:
-	 *   - execute test_function
-	 *   - fd1 event breakpoint hit -> count1 == 1
-	 *   - SIGIO is delivered       -> overflows == 1
-	 *   - fd2 event breakpoint hit -> count2 == 1
+	 *   Exec:               Action:                       Result:
+	 *   incq (%rdi)       - fd1 event breakpoint hit   -> count1 == 1
+	 *                     - SIGIO is delivered
+	 *   sig_handler       - fd2 event breakpoint hit   -> count2 == 1
+	 *                     - SIGUSR1 is delivered
+	 *   sig_handler_2                                  -> overflows_2 == 1  (nested signal)
+	 *   sys_rt_sigreturn  - return from sig_handler_2
+	 *   overflows++                                    -> overflows = 1
+	 *   sys_rt_sigreturn  - return from sig_handler
+	 *   incq (%rdi)       - fd3 event watchpoint hit   -> count3 == 1       (wp and bp in one insn)
+	 *                     - SIGIO is delivered
+	 *   sig_handler       - fd2 event breakpoint hit   -> count2 == 2
+	 *                     - SIGUSR1 is delivered
+	 *   sig_handler_2                                  -> overflows_2 == 2  (nested signal)
+	 *   sys_rt_sigreturn  - return from sig_handler_2
+	 *   overflows++                                    -> overflows = 2
+	 *   sys_rt_sigreturn  - return from sig_handler
+	 *   the_var++         - fd3 event watchpoint hit   -> count3 == 2       (standalone watchpoint)
+	 *                     - SIGIO is delivered
+	 *   sig_handler       - fd2 event breakpoint hit   -> count2 == 3
+	 *                     - SIGUSR1 is delivered
+	 *   sig_handler_2                                  -> overflows_2 == 3  (nested signal)
+	 *   sys_rt_sigreturn  - return from sig_handler_2
+	 *   overflows++                                    -> overflows == 3
+	 *   sys_rt_sigreturn  - return from sig_handler
 	 *
 	 * The test case check following error conditions:
 	 * - we get stuck in signal handler because of debug
@@ -152,11 +237,13 @@ int test__bp_signal(int subtest __maybe_unused)
 	 *
 	 */
 
-	fd1 = bp_event(test_function, 1);
-	fd2 = bp_event(sig_handler, 0);
+	fd1 = bp_event(__test_function, SIGIO);
+	fd2 = bp_event(sig_handler, SIGUSR1);
+	fd3 = wp_event((void *)&the_var, SIGIO);
 
 	ioctl(fd1, PERF_EVENT_IOC_ENABLE, 0);
 	ioctl(fd2, PERF_EVENT_IOC_ENABLE, 0);
+	ioctl(fd3, PERF_EVENT_IOC_ENABLE, 0);
 
 	/*
 	 * Kick off the test by trigering 'fd1'
@@ -166,15 +253,18 @@ int test__bp_signal(int subtest __maybe_unused)
 
 	ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
 	ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
+	ioctl(fd3, PERF_EVENT_IOC_DISABLE, 0);
 
 	count1 = bp_count(fd1);
 	count2 = bp_count(fd2);
+	count3 = bp_count(fd3);
 
 	close(fd1);
 	close(fd2);
+	close(fd3);
 
-	pr_debug("count1 %lld, count2 %lld, overflow %d\n",
-		 count1, count2, overflows);
+	pr_debug("count1 %lld, count2 %lld, count3 %lld, overflow %d, overflows_2 %d\n",
+		 count1, count2, count3, overflows, overflows_2);
 
 	if (count1 != 1) {
 		if (count1 == 11)
@@ -183,12 +273,18 @@ int test__bp_signal(int subtest __maybe_unused)
 			pr_debug("failed: wrong count for bp1%lld\n", count1);
 	}
 
-	if (overflows != 1)
+	if (overflows != 3)
 		pr_debug("failed: wrong overflow hit\n");
 
-	if (count2 != 1)
+	if (overflows_2 != 3)
+		pr_debug("failed: wrong overflow_2 hit\n");
+
+	if (count2 != 3)
 		pr_debug("failed: wrong count for bp2\n");
 
-	return count1 == 1 && overflows == 1 && count2 == 1 ?
+	if (count3 != 2)
+		pr_debug("failed: wrong count for bp3\n");
+
+	return count1 == 1 && overflows == 3 && count2 == 3 && overflows_2 == 3 && count3 == 2 ?
 		TEST_OK : TEST_FAIL;
 }

  reply	other threads:[~2016-02-03 10:19 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-25  9:55 [GIT PULL 00/54] perf tools: Bugfix, BPF improvements and overwrite ring buffer support Wang Nan
2016-01-25  9:55 ` [PATCH 01/54] perf test: Add libbpf relocation checker Wang Nan
2016-01-26 14:58   ` Arnaldo Carvalho de Melo
2016-01-26 15:07     ` Arnaldo Carvalho de Melo
2016-02-03 10:13   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 02/54] perf bpf: Check relocation target section Wang Nan
2016-02-03 10:14   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 03/54] tools build: Allow subprojects select all feature checkers Wang Nan
2016-02-03 10:14   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 04/54] perf build: Select all feature checkers for feature-dump Wang Nan
2016-02-03 10:14   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 05/54] perf build: Use feature dump file for build-test Wang Nan
2016-01-26 16:59   ` Arnaldo Carvalho de Melo
2016-01-27  2:36     ` Wangnan (F)
2016-01-27 13:54       ` Arnaldo Carvalho de Melo
2016-01-27 11:22     ` [PATCH] tools build: Check basic headers for test-compile feature checker Wang Nan
2016-01-27 13:23       ` Jiri Olsa
2016-01-27 13:55         ` Arnaldo Carvalho de Melo
2016-02-03 10:15       ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 06/54] perf test: Check environment before start real BPF test Wang Nan
2016-02-03 10:18   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:55 ` [PATCH 07/54] perf tools: Fix symbols searching for offline module in buildid-cache Wang Nan
2016-01-25  9:55 ` [PATCH 08/54] perf test: Improve bp_signal Wang Nan
2016-02-03 10:18   ` tip-bot for Wang Nan [this message]
2016-01-25  9:55 ` [PATCH 09/54] perf tools: Add API to config maps in bpf object Wang Nan
2016-02-03 23:29   ` Arnaldo Carvalho de Melo
2016-02-04 12:59     ` Wangnan (F)
2016-01-25  9:55 ` [PATCH 10/54] perf tools: Enable BPF object configure syntax Wang Nan
2016-01-25  9:55 ` [PATCH 11/54] perf record: Apply config to BPF objects before recording Wang Nan
2016-01-25  9:55 ` [PATCH 12/54] perf tools: Enable passing event to BPF object Wang Nan
2016-01-25  9:56 ` [PATCH 13/54] perf tools: Support perf event alias name Wang Nan
2016-02-03 23:35   ` Arnaldo Carvalho de Melo
2016-01-25  9:56 ` [PATCH 14/54] perf tools: Support setting different slots in a BPF map separately Wang Nan
2016-01-25  9:56 ` [PATCH 15/54] perf tools: Enable indices setting syntax for BPF maps Wang Nan
2016-01-25  9:56 ` [PATCH 16/54] perf tools: Introduce bpf-output event Wang Nan
2016-01-25  9:56 ` [PATCH 17/54] perf data: Support converting data from bpf_perf_event_output() Wang Nan
2016-01-25  9:56 ` [PATCH 18/54] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan
2016-01-25  9:56 ` [PATCH 19/54] perf core: Set event's default overflow_handler Wang Nan
2016-01-25  9:56 ` [PATCH 20/54] perf core: Prepare writing into ring buffer from end Wang Nan
2016-01-25  9:56 ` [PATCH 21/54] perf core: Add backward attribute to perf event Wang Nan
2016-01-25  9:56 ` [PATCH 22/54] perf core: Reduce perf event output overhead by new overflow handler Wang Nan
2016-01-25  9:56 ` [PATCH 23/54] perf tools: Introduce API to pause ring buffer Wang Nan
2016-01-25  9:56 ` [PATCH 24/54] perf tools: Only validate is_pos for tracking evsels Wang Nan
2016-01-25  9:56 ` [PATCH 25/54] perf tools: Print write_backward value in perf_event_attr__fprintf Wang Nan
2016-01-25  9:56 ` [PATCH 26/54] perf tools: Move timestamp creation to util Wang Nan
2016-02-03 10:18   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:56 ` [PATCH 27/54] perf tools: Make ordered_events reusable Wang Nan
2016-01-25  9:56 ` [PATCH 28/54] perf record: Extract synthesize code to record__synthesize() Wang Nan
2016-01-29 20:37   ` Arnaldo Carvalho de Melo
2016-01-25  9:56 ` [PATCH 29/54] perf tools: Add perf_data_file__switch() helper Wang Nan
2016-01-25  9:56 ` [PATCH 30/54] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan
2016-01-25  9:56 ` [PATCH 31/54] perf record: Introduce record__finish_output() to finish a perf.data Wang Nan
2016-01-25  9:56 ` [PATCH 32/54] perf record: Use OPT_BOOLEAN_SET for buildid cache related options Wang Nan
2016-02-03 10:19   ` [tip:perf/core] " tip-bot for Wang Nan
2016-01-25  9:56 ` [PATCH 33/54] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan
2016-01-25  9:56 ` [PATCH 34/54] perf record: Split output into multiple files via '--switch-output' Wang Nan
2016-01-25  9:56 ` [PATCH 35/54] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan
2016-01-25  9:56 ` [PATCH 36/54] perf record: Disable buildid cache options by default in switch output mode Wang Nan
2016-01-25  9:56 ` [PATCH 37/54] perf record: Re-synthesize tracking events after output switching Wang Nan
2016-01-25  9:56 ` [PATCH 38/54] perf record: Generate tracking events for process forked by perf Wang Nan
2016-01-25  9:56 ` [PATCH 39/54] perf record: Ensure return non-zero rc when mmap fail Wang Nan
2016-01-25  9:56 ` [PATCH 40/54] perf record: Prevent reading invalid data in record__mmap_read Wang Nan
2016-01-25  9:56 ` [PATCH 41/54] perf tools: Add evlist channel helpers Wang Nan
2016-01-25  9:56 ` [PATCH 42/54] perf tools: Automatically add new channel according to evlist Wang Nan
2016-01-25  9:56 ` [PATCH 43/54] perf tools: Operate multiple channels Wang Nan
2016-01-25  9:56 ` [PATCH 44/54] perf tools: Squash overwrite setting into channel Wang Nan
2016-01-25  9:56 ` [PATCH 45/54] perf record: Don't read from and poll overwrite channel Wang Nan
2016-01-25  9:56 ` [PATCH 46/54] perf record: Don't poll on " Wang Nan
2016-01-25  9:56 ` [PATCH 47/54] perf tools: Detect avalibility of write_backward Wang Nan
2016-01-25  9:56 ` [PATCH 48/54] perf tools: Enable overwrite settings Wang Nan
2016-01-25  9:56 ` [PATCH 49/54] perf tools: Set write_backward attribut bit for overwrite events Wang Nan
2016-01-25  9:56 ` [PATCH 50/54] perf record: Toggle overwrite ring buffer for reading Wang Nan
2016-01-26  8:25   ` Wangnan (F)
2016-01-25  9:56 ` [PATCH 51/54] perf record: Rename variable to make code clear Wang Nan
2016-01-25  9:56 ` [PATCH 52/54] perf record: Read from backward ring buffer Wang Nan
2016-01-25  9:56 ` [PATCH 53/54] perf record: Allow generate tracking events at the end of output Wang Nan
2016-01-25  9:56 ` [PATCH 54/54] perf tools: Don't warn about out of order event if write_backward is used Wang Nan
2016-01-26  9:11 ` [offlist] Re: [GIT PULL 00/54] perf tools: Bugfix, BPF improvements and overwrite ring buffer support Wangnan (F)
2016-01-26 14:11   ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-8fd34e1cce180eb0c726e7ed88f7b70c11c38e21@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=acme@redhat.com \
    --cc=ast@kernel.org \
    --cc=brendan.d.gregg@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=hekuang@huawei.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=wangnan0@huawei.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome