From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Wang Nan <wangnan0@huawei.com>
Cc: linux-kernel@vger.kernel.org, pi3orama@163.com,
lizefan@huawei.com, netdev@vger.kernel.org, davem@davemloft.net,
Will Deacon <will.deacon@arm.com>, Jiri Olsa <jolsa@kernel.org>
Subject: Re: [PATCH 17/53] perf test: Improve bp_signal
Date: Mon, 11 Jan 2016 18:37:29 -0300 [thread overview]
Message-ID: <20160111213729.GI18367@kernel.org> (raw)
In-Reply-To: <1452520124-2073-18-git-send-email-wangnan0@huawei.com>
Em Mon, Jan 11, 2016 at 01:48:08PM +0000, Wang Nan escreveu:
> 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: Will Deacon <will.deacon@arm.com>
Will, are you ok with this one? Can I have an Acked-by or better,
Tested-by for the AARCH64 base?
IIRC Jiri made some comment about this one?
- Arnaldo
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: 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;
> }
> --
> 1.8.3.4
next prev parent reply other threads:[~2016-01-11 21:37 UTC|newest]
Thread overview: 124+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-11 13:47 [PATCH 00/53] perf tools: Bugfix, BPF improvement and perf record flight record mode Wang Nan
2016-01-11 13:47 ` [PATCH 01/53] perf tools: Add -lutil in python lib list for broken python-config Wang Nan
2016-01-12 9:43 ` Jiri Olsa
2016-01-12 10:09 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:47 ` [PATCH 02/53] perf tools: Fix phony build target for build-test Wang Nan
2016-01-12 10:09 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:47 ` [PATCH 03/53] perf tools: Set parallel making options build-test Wang Nan
2016-01-11 13:47 ` [PATCH 04/53] perf tools: Pass O option to Makefile.perf in build-test Wang Nan
2016-01-11 13:47 ` [PATCH 05/53] perf tools: Test correct path of perf " Wang Nan
2016-01-11 15:24 ` Arnaldo Carvalho de Melo
2016-01-11 22:06 ` Arnaldo Carvalho de Melo
2016-01-11 22:39 ` Arnaldo Carvalho de Melo
2016-01-11 22:39 ` Arnaldo Carvalho de Melo
2016-01-12 7:16 ` Wangnan (F)
2016-01-12 14:08 ` Arnaldo Carvalho de Melo
2016-01-11 13:47 ` [PATCH 06/53] perf tools: Fix PowerPC native building Wang Nan
2016-01-12 10:10 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:47 ` [PATCH 07/53] tools: Move Makefile.arch from perf/config to tools/scripts Wang Nan
2016-01-11 13:52 ` Wangnan (F)
2016-01-11 14:10 ` Arnaldo Carvalho de Melo
2016-01-12 10:10 ` [tip:perf/urgent] tools: Move Makefile.arch from perf/ config " tip-bot for Wang Nan
2016-01-11 13:47 ` [PATCH 08/53] perf tools: Add missing sources in perf's MANIFEST Wang Nan
2016-01-11 13:48 ` [PATCH 09/53] perf: bpf: Fix build breakage due to libbpf Wang Nan
2016-01-12 10:10 ` [tip:perf/urgent] perf " tip-bot for Naveen N. Rao
2016-01-11 13:48 ` [PATCH 10/53] tools build: Add BPF feature check to test-all Wang Nan
2016-01-12 10:11 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:48 ` [PATCH 11/53] perf test: Fix false TEST_OK result for 'perf test hist' Wang Nan
2016-01-11 14:25 ` Sergei Shtylyov
2016-01-11 14:58 ` Arnaldo Carvalho de Melo
2016-01-11 15:32 ` Arnaldo Carvalho de Melo
2016-01-12 10:11 ` [tip:perf/urgent] perf test: Fix false TEST_OK result for ' perf " tip-bot for Wang Nan
2016-01-11 13:48 ` [PATCH 12/53] perf test: Reset err after using it hold errcode in hist testcases Wang Nan
2016-01-12 10:11 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:48 ` [PATCH 13/53] perf tools: Prevent calling machine__delete() on non-allocated machine Wang Nan
2016-01-11 15:42 ` Arnaldo Carvalho de Melo
2016-01-12 7:03 ` Wangnan (F)
2016-01-12 14:07 ` Arnaldo Carvalho de Melo
2016-01-11 13:48 ` [PATCH 14/53] perf test: Check environment before start real BPF test Wang Nan
2016-01-11 21:55 ` Arnaldo Carvalho de Melo
2016-01-12 7:40 ` Wangnan (F)
2016-01-12 14:10 ` Arnaldo Carvalho de Melo
2016-01-11 13:48 ` [PATCH 15/53] perf tools: Fix symbols searching for offline module in buildid-cache Wang Nan
2016-01-11 13:48 ` [PATCH 16/53] perf tools: Fix mmap2 event allocation in synthesize code Wang Nan
2016-01-11 21:03 ` Arnaldo Carvalho de Melo
2016-01-12 10:12 ` [PATCH 16/53 v2] " Wang Nan
2016-01-12 10:49 ` 平松雅巳 / HIRAMATU,MASAMI
2016-01-12 10:51 ` Wangnan (F)
2016-01-12 14:24 ` acme
2016-01-13 0:40 ` 平松雅巳 / HIRAMATU,MASAMI
2016-01-13 9:40 ` [tip:perf/urgent] " tip-bot for Wang Nan
2016-01-11 13:48 ` [PATCH 17/53] perf test: Improve bp_signal Wang Nan
2016-01-11 21:37 ` Arnaldo Carvalho de Melo [this message]
2016-01-12 4:13 ` Wangnan (F)
2016-01-12 9:21 ` Jiri Olsa
2016-01-12 14:11 ` Arnaldo Carvalho de Melo
2016-01-12 14:17 ` Will Deacon
2016-01-11 13:48 ` [PATCH 18/53] perf tools: Add API to config maps in bpf object Wang Nan
2016-01-11 13:48 ` [PATCH 19/53] perf tools: Enable BPF object configure syntax Wang Nan
2016-01-11 13:48 ` [PATCH 20/53] perf record: Apply config to BPF objects before recording Wang Nan
2016-01-11 13:48 ` [PATCH 21/53] perf tools: Enable passing event to BPF object Wang Nan
2016-01-11 13:48 ` [PATCH 22/53] perf tools: Support perf event alias name Wang Nan
2016-01-11 13:48 ` [PATCH 23/53] perf tools: Support setting different slots in a BPF map separately Wang Nan
2016-01-11 13:48 ` [PATCH 24/53] perf tools: Enable indices setting syntax for BPF maps Wang Nan
2016-01-11 13:48 ` [PATCH 25/53] perf tools: Introduce bpf-output event Wang Nan
2016-01-11 13:48 ` [PATCH 26/53] perf data: Support converting data from bpf_perf_event_output() Wang Nan
2016-01-11 13:48 ` [PATCH 27/53] perf/core: Put size of a sample at the end of it by PERF_SAMPLE_TAILSIZE Wang Nan
2016-01-11 18:09 ` Alexei Starovoitov
2016-01-12 5:33 ` Wangnan (F)
2016-01-12 6:11 ` Alexei Starovoitov
2016-01-12 12:36 ` Wangnan (F)
2016-01-12 19:56 ` Alexei Starovoitov
2016-01-13 4:34 ` Wangnan (F)
2016-01-13 5:14 ` Alexei Starovoitov
2016-01-12 14:05 ` Peter Zijlstra
2016-01-12 14:14 ` Peter Zijlstra
2016-01-18 11:52 ` [PATCH] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan
2016-01-18 12:02 ` Peter Zijlstra
2016-01-19 2:55 ` Wangnan (F)
2016-01-19 11:16 ` [PATCH 0/6] perf core: Read from overwrite " Wang Nan
2016-01-19 11:16 ` [PATCH 1/6] perf core: Introduce new ioctl options to pause and resume " Wang Nan
2016-01-19 11:16 ` [PATCH 2/6] perf core: Set event's default overflow_handler Wang Nan
2016-01-19 11:16 ` [PATCH 3/6] perf core: Prepare writing into ring buffer from end Wang Nan
2016-01-19 11:16 ` [PATCH 4/6] perf core: Add backwork attribute to perf event Wang Nan
2016-01-19 11:16 ` [PATCH 5/6] perf core: Reduce perf event output overhead by setting overwrite handler Wang Nan
2016-01-19 11:16 ` [PATCH 6/6] perf/core: Put size of a sample at the end of it by PERF_SAMPLE_TAILSIZE Wang Nan
2016-01-19 13:58 ` [PATCH 0/6] perf core: Read from overwrite ring buffer Namhyung Kim
2016-01-19 14:14 ` pi3orama
2016-01-19 17:42 ` Alexei Starovoitov
2016-01-20 1:37 ` Wangnan (F)
2016-01-20 2:20 ` Alexei Starovoitov
2016-01-21 6:51 ` Wangnan (F)
2016-01-22 2:21 ` Wangnan (F)
2016-01-22 3:21 ` Alexei Starovoitov
2016-01-22 4:45 ` Wangnan (F)
2016-01-11 13:48 ` [PATCH 28/53] perf tools: Move timestamp creation to util Wang Nan
2016-01-11 13:48 ` [PATCH 29/53] perf tools: Make ordered_events reusable Wang Nan
2016-01-11 21:33 ` Arnaldo Carvalho de Melo
2016-01-11 13:48 ` [PATCH 30/53] perf record: Extract synthesize code to record__synthesize() Wang Nan
2016-01-11 13:48 ` [PATCH 31/53] perf tools: Add perf_data_file__switch() helper Wang Nan
2016-01-11 13:48 ` [PATCH 32/53] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan
2016-01-11 13:48 ` [PATCH 33/53] perf record: Introduce record__finish_output() to finish a perf.data Wang Nan
2016-01-11 13:48 ` [PATCH 34/53] perf record: Use OPT_BOOLEAN_SET for buildid cache related options Wang Nan
2016-01-11 13:48 ` [PATCH 35/53] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan
2016-01-11 13:48 ` [PATCH 36/53] perf record: Split output into multiple files via '--switch-output' Wang Nan
2016-01-11 13:48 ` [PATCH 37/53] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan
2016-01-11 13:48 ` [PATCH 38/53] perf record: Disable buildid cache options by default in switch output mode Wang Nan
2016-01-11 13:48 ` [PATCH 39/53] perf record: Re-synthesize tracking events after output switching Wang Nan
2016-01-11 13:48 ` [PATCH 40/53] perf record: Generate tracking events for process forked by perf Wang Nan
2016-01-11 13:48 ` [PATCH 41/53] perf record: Ensure return non-zero rc when mmap fail Wang Nan
2016-01-11 13:48 ` [PATCH 42/53] perf record: Prevent reading invalid data in record__mmap_read Wang Nan
2016-01-11 14:21 ` Sergei Shtylyov
2016-01-11 15:00 ` Arnaldo Carvalho de Melo
2016-01-11 15:01 ` Arnaldo Carvalho de Melo
2016-01-11 13:48 ` [PATCH 43/53] perf tools: Add evlist channel helpers Wang Nan
2016-01-11 13:48 ` [PATCH 44/53] perf tools: Automatically add new channel according to evlist Wang Nan
2016-01-11 13:48 ` [PATCH 45/53] perf tools: Operate multiple channels Wang Nan
2016-01-11 13:48 ` [PATCH 46/53] perf tools: Squash overwrite setting into channel Wang Nan
2016-01-11 13:48 ` [PATCH 47/53] perf record: Don't read from and poll overwrite channel Wang Nan
2016-01-11 13:48 ` [PATCH 48/53] perf tools: Enable overwrite settings Wang Nan
2016-01-11 13:48 ` [PATCH 49/53] perf tools: Consider TAILSIZE bit when caclulate is_pos Wang Nan
2016-01-11 13:48 ` [PATCH 50/53] perf tools: Set tailsize attribut bit for overwrite events Wang Nan
2016-01-11 13:48 ` [PATCH 51/53] perf record: Read from tailsize ring buffer Wang Nan
2016-01-11 13:48 ` [PATCH 52/53] perf record: Toggle tailsize ring buffer for reading Wang Nan
2016-01-11 13:48 ` [PATCH 53/53] perf record: Allow generate tracking events at the end of output Wang Nan
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=20160111213729.GI18367@kernel.org \
--to=acme@kernel.org \
--cc=davem@davemloft.net \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=netdev@vger.kernel.org \
--cc=pi3orama@163.com \
--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;
as well as URLs for NNTP newsgroup(s).