From 5434dca0dbda99ff62737ec849a96abb2ce73fdf Mon Sep 17 00:00:00 2001 From: Wang Nan Date: Mon, 28 Mar 2016 06:41:30 +0000 Subject: 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 Signed-off-by: Peter Zijlstra (Intel) Cc: Cc: Alexander Shishkin Cc: Alexei Starovoitov Cc: Arnaldo Carvalho de Melo Cc: Brendan Gregg Cc: He Kuang Cc: Jiri Olsa Cc: Jiri Olsa Cc: Linus Torvalds Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Vince Weaver Cc: Zefan Li Link: http://lkml.kernel.org/r/1459147292-239310-3-git-send-email-wangnan0@huawei.com Signed-off-by: Ingo Molnar Signed-off-by: Chatur27 --- arch/arm/kernel/hw_breakpoint.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) (limited to 'arch/arm/kernel/hw_breakpoint.c') diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 78c6be1b2714..89fd86301242 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. @@ -688,12 +688,6 @@ static void disable_single_step(struct perf_event *bp) arch_install_hw_breakpoint(bp); } -static int watchpoint_fault_on_uaccess(struct pt_regs *regs, - struct arch_hw_breakpoint *info) -{ - return !user_mode(regs) && info->ctrl.privilege == ARM_BREAKPOINT_USER; -} - static void watchpoint_handler(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { @@ -760,20 +754,17 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr, * can't help us with this. */ if (watchpoint_fault_on_uaccess(regs, info)) - goto step; + enable_single_step(wp, instruction_pointer(regs)); perf_bp_event(wp, regs); /* - * Defer stepping to the overflow handler if one is installed. - * Otherwise, insert a temporary mismatch breakpoint so that - * we can single-step over the watchpoint trigger. + * If no overflow handler is present, insert a temporary + * mismatch breakpoint so we can single-step over the + * watchpoint trigger. */ - if (wp->overflow_handler) - goto unlock; - -step: - enable_single_step(wp, instruction_pointer(regs)); + if (is_default_overflow_handler(wp)) + enable_single_step(wp, instruction_pointer(regs)); unlock: rcu_read_unlock(); } @@ -1163,4 +1154,4 @@ int hw_breakpoint_exceptions_notify(struct notifier_block *unused, unsigned long val, void *data) { return NOTIFY_DONE; -} +} \ No newline at end of file -- cgit v1.2.3