summaryrefslogtreecommitdiff
path: root/arch/s390/kernel/perf_event.c
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2019-10-30 14:20:32 +0100
committerVasily Gorbik <gor@linux.ibm.com>2019-10-31 17:20:54 +0100
commiteffb83ccc83a97dbbe5214f4c443522719f05f3a (patch)
treebdf7eb70439c5b2ccc660c29e7ea5a8896a06243 /arch/s390/kernel/perf_event.c
parent265f79dcb5702aeffcd9453c8cbb5fb707652323 (diff)
s390: add error handling to perf_callchain_kernel
perf_callchain_kernel stops neither when it encounters a garbage address, nor when it runs out of space. Fix both issues using x86 version as an inspiration. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/kernel/perf_event.c')
-rw-r--r--arch/s390/kernel/perf_event.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c
index fcb6c2e92b07..1e75cc983546 100644
--- a/arch/s390/kernel/perf_event.c
+++ b/arch/s390/kernel/perf_event.c
@@ -224,9 +224,13 @@ void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
struct pt_regs *regs)
{
struct unwind_state state;
+ unsigned long addr;
- unwind_for_each_frame(&state, current, regs, 0)
- perf_callchain_store(entry, state.ip);
+ unwind_for_each_frame(&state, current, regs, 0) {
+ addr = unwind_get_return_address(&state);
+ if (!addr || perf_callchain_store(entry, addr))
+ return;
+ }
}
/* Perf definitions for PMU event attributes in sysfs */