diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /arch/sparc/kernel/perf_event.c | |
parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'arch/sparc/kernel/perf_event.c')
-rw-r--r-- | arch/sparc/kernel/perf_event.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index b0da5aedb336..6596f66ce112 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar | 9 | * Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar |
10 | * Copyright (C) 2009 Jaswinder Singh Rajput | 10 | * Copyright (C) 2009 Jaswinder Singh Rajput |
11 | * Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter | 11 | * Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter |
12 | * Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com> | 12 | * Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/perf_event.h> | 15 | #include <linux/perf_event.h> |
@@ -1828,11 +1828,18 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry, | |||
1828 | void | 1828 | void |
1829 | perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) | 1829 | perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) |
1830 | { | 1830 | { |
1831 | u64 saved_fault_address = current_thread_info()->fault_address; | ||
1832 | u8 saved_fault_code = get_thread_fault_code(); | ||
1833 | mm_segment_t old_fs; | ||
1834 | |||
1831 | perf_callchain_store(entry, regs->tpc); | 1835 | perf_callchain_store(entry, regs->tpc); |
1832 | 1836 | ||
1833 | if (!current->mm) | 1837 | if (!current->mm) |
1834 | return; | 1838 | return; |
1835 | 1839 | ||
1840 | old_fs = get_fs(); | ||
1841 | set_fs(USER_DS); | ||
1842 | |||
1836 | flushw_user(); | 1843 | flushw_user(); |
1837 | 1844 | ||
1838 | pagefault_disable(); | 1845 | pagefault_disable(); |
@@ -1843,4 +1850,8 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) | |||
1843 | perf_callchain_user_64(entry, regs); | 1850 | perf_callchain_user_64(entry, regs); |
1844 | 1851 | ||
1845 | pagefault_enable(); | 1852 | pagefault_enable(); |
1853 | |||
1854 | set_fs(old_fs); | ||
1855 | set_thread_fault_code(saved_fault_code); | ||
1856 | current_thread_info()->fault_address = saved_fault_address; | ||
1846 | } | 1857 | } |