All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Wang Nan <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: peterz@infradead.org, wangnan0@huawei.com, mingo@kernel.org,
	hekuang@huawei.com, jolsa@redhat.com,
	alexander.shishkin@linux.intel.com, tglx@linutronix.de,
	masami.hiramatsu.pt@hitachi.com, hpa@zytor.com,
	namhyung@kernel.org, brendan.d.gregg@gmail.com, jolsa@kernel.org,
	ast@kernel.org, pi3orama@163.com, acme@redhat.com,
	linux-kernel@vger.kernel.org, lizefan@huawei.com,
	torvalds@linux-foundation.org, vincent.weaver@maine.edu,
	eranian@google.com
Subject: [tip:perf/core] perf/core: Set event's default ::overflow_handler()
Date: Thu, 31 Mar 2016 02:26:29 -0700	[thread overview]
Message-ID: <tip-1879445dfa7bbd6fe21b09c5cc72f4934798afed@git.kernel.org> (raw)
In-Reply-To: <1459147292-239310-3-git-send-email-wangnan0@huawei.com>

Commit-ID:  1879445dfa7bbd6fe21b09c5cc72f4934798afed
Gitweb:     http://git.kernel.org/tip/1879445dfa7bbd6fe21b09c5cc72f4934798afed
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Mon, 28 Mar 2016 06:41:30 +0000
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 31 Mar 2016 10:30:47 +0200

perf/core: Set event's default ::overflow_handler()

Set a default event->overflow_handler in perf_event_alloc() so don't
need to check event->overflow_handler in __perf_event_overflow().
Following commits can give a different default overflow_handler.

Initial idea comes from Peter:

  http://lkml.kernel.org/r/20130708121557.GA17211@twins.programming.kicks-ass.net

Since the default value of event->overflow_handler is not NULL, existing
'if (!overflow_handler)' checks need to be changed.

is_default_overflow_handler() is introduced for this.

No extra performance overhead is introduced into the hot path because in the
original code we still need to read this handler from memory. A conditional
branch is avoided so actually we remove some instructions.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: <pi3orama@163.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/r/1459147292-239310-3-git-send-email-wangnan0@huawei.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/arm/kernel/hw_breakpoint.c   |  4 ++--
 arch/arm64/kernel/hw_breakpoint.c |  4 ++--
 include/linux/perf_event.h        |  6 ++++++
 kernel/events/core.c              | 14 ++++++++------
 4 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c
index 6284779..b8df458 100644
--- a/arch/arm/kernel/hw_breakpoint.c
+++ b/arch/arm/kernel/hw_breakpoint.c
@@ -631,7 +631,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
 	info->address &= ~alignment_mask;
 	info->ctrl.len <<= offset;
 
-	if (!bp->overflow_handler) {
+	if (is_default_overflow_handler(bp)) {
 		/*
 		 * Mismatch breakpoints are required for single-stepping
 		 * breakpoints.
@@ -754,7 +754,7 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr,
 		 * mismatch breakpoint so we can single-step over the
 		 * watchpoint trigger.
 		 */
-		if (!wp->overflow_handler)
+		if (is_default_overflow_handler(wp))
 			enable_single_step(wp, instruction_pointer(regs));
 
 unlock:
diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c
index b45c95d..4ef5373 100644
--- a/arch/arm64/kernel/hw_breakpoint.c
+++ b/arch/arm64/kernel/hw_breakpoint.c
@@ -616,7 +616,7 @@ static int breakpoint_handler(unsigned long unused, unsigned int esr,
 		perf_bp_event(bp, regs);
 
 		/* Do we need to handle the stepping? */
-		if (!bp->overflow_handler)
+		if (is_default_overflow_handler(bp))
 			step = 1;
 unlock:
 		rcu_read_unlock();
@@ -712,7 +712,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
 		perf_bp_event(wp, regs);
 
 		/* Do we need to handle the stepping? */
-		if (!wp->overflow_handler)
+		if (is_default_overflow_handler(wp))
 			step = 1;
 
 unlock:
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 15588d4..4065ca2 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -838,6 +838,12 @@ extern void perf_event_output(struct perf_event *event,
 				struct perf_sample_data *data,
 				struct pt_regs *regs);
 
+static inline bool
+is_default_overflow_handler(struct perf_event *event)
+{
+	return (event->overflow_handler == perf_event_output);
+}
+
 extern void
 perf_event_header__init_id(struct perf_event_header *header,
 			   struct perf_sample_data *data,
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 51386e8..8c3b35f 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6628,10 +6628,7 @@ static int __perf_event_overflow(struct perf_event *event,
 		irq_work_queue(&event->pending);
 	}
 
-	if (event->overflow_handler)
-		event->overflow_handler(event, data, regs);
-	else
-		perf_event_output(event, data, regs);
+	event->overflow_handler(event, data, regs);
 
 	if (*perf_event_fasync(event) && event->pending_kill) {
 		event->pending_wakeup = 1;
@@ -8152,8 +8149,13 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
 		context = parent_event->overflow_handler_context;
 	}
 
-	event->overflow_handler	= overflow_handler;
-	event->overflow_handler_context = context;
+	if (overflow_handler) {
+		event->overflow_handler	= overflow_handler;
+		event->overflow_handler_context = context;
+	} else {
+		event->overflow_handler = perf_event_output;
+		event->overflow_handler_context = NULL;
+	}
 
 	perf_event__state_init(event);
 

  reply	other threads:[~2016-03-31  9:27 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-28  6:41 [PATCH 0/4] perf core: Support reading from overwritable ring buffer Wang Nan
2016-03-28  6:41 ` [PATCH 1/4] perf core: Introduce new ioctl options to pause and resume " Wang Nan
2016-03-28 10:15   ` [PATCH][manpages 1/2] perf_event_open.2: Document PERF_EVENT_IOC_PAUSE_OUTPUT Wang Nan
2016-03-28 10:15     ` Wang Nan
2016-10-21  8:56     ` Michael Kerrisk (man-pages)
2016-10-21  8:56       ` Michael Kerrisk (man-pages)
2016-10-21 14:37       ` Vince Weaver
2016-10-21 14:37         ` Vince Weaver
2016-10-21 14:49         ` Michael Kerrisk (man-pages)
2016-10-21 14:49           ` Michael Kerrisk (man-pages)
2016-03-29  0:27   ` [PATCH 1/4] perf core: Introduce new ioctl options to pause and resume ring buffer Alexei Starovoitov
2016-03-29  1:10     ` Wangnan (F)
2016-03-29  2:05     ` [PATCH 1/4 fix] " Wang Nan
2016-03-29  4:39       ` Alexei Starovoitov
2016-03-29 12:54   ` [PATCH 1/4] " Peter Zijlstra
2016-03-29 12:55     ` Peter Zijlstra
2016-03-30  1:57     ` Wangnan (F)
2016-03-30  6:46       ` Peter Zijlstra
2016-03-31  9:26   ` [tip:perf/core] perf/ring_buffer: Introduce new ioctl options to pause and resume the ring-buffer tip-bot for Wang Nan
2016-03-28  6:41 ` [PATCH 2/4] perf core: Set event's default overflow_handler Wang Nan
2016-03-31  9:26   ` tip-bot for Wang Nan [this message]
2016-03-28  6:41 ` [PATCH 3/4] perf core: Prepare writing into ring buffer from end Wang Nan
2016-03-29  0:25   ` Alexei Starovoitov
2016-03-31  9:26   ` [tip:perf/core] perf/ring_buffer: Prepare writing into the ring-buffer from the end tip-bot for Wang Nan
2016-03-28  6:41 ` [PATCH 4/4] perf core: Add backward attribute to perf event Wang Nan
2016-03-28 10:16   ` [PATCH][manpages 2/2] perf_event_open.2: Document write_backward Wang Nan
2016-03-28 10:16     ` Wang Nan
2016-10-21  8:57     ` Michael Kerrisk (man-pages)
2016-03-29  0:28   ` [PATCH 4/4] perf core: Add backward attribute to perf event Alexei Starovoitov
2016-03-29  2:01   ` Wangnan (F)
2016-03-29  4:59     ` Alexei Starovoitov
2016-03-29  5:59       ` Wangnan (F)
2016-03-29 14:04   ` Peter Zijlstra
2016-03-30  2:28     ` Wangnan (F)
2016-03-30  2:38       ` Wangnan (F)
2016-04-05 14:05         ` Wangnan (F)
2016-04-07  9:45     ` Wangnan (F)

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-1879445dfa7bbd6fe21b09c5cc72f4934798afed@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=acme@redhat.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=ast@kernel.org \
    --cc=brendan.d.gregg@gmail.com \
    --cc=eranian@google.com \
    --cc=hekuang@huawei.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@kernel.org \
    --cc=jolsa@redhat.com \
    --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=pi3orama@163.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=vincent.weaver@maine.edu \
    --cc=wangnan0@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.