summaryrefslogtreecommitdiff
path: root/arch/powerpc/perf/callchain.h
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2020-11-11 22:01:51 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2020-11-19 16:56:52 +1100
commit987c426320cce72d1b28f55c8603b239e4f7187c (patch)
treeb1e9572df774b1b1c48091285984b81b9be874d2 /arch/powerpc/perf/callchain.h
parentfdcfeaba38e5b183045f5b079af94f97658eabe6 (diff)
powerpc/64s/perf: perf interrupt does not have to get_user_pages to access user memory
read_user_stack_slow that walks user address translation by hand is only required on hash, because a hash fault can not be serviced from "NMI" context (to avoid re-entering the hash code) so the user stack can be mapped into Linux page tables but not accessible by the CPU. Radix MMU mode does not have this restriction. A page fault failure would indicate the page is not accessible via get_user_pages either, so avoid this on radix. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20201111120151.3150658-1-npiggin@gmail.com
Diffstat (limited to 'arch/powerpc/perf/callchain.h')
-rw-r--r--arch/powerpc/perf/callchain.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/powerpc/perf/callchain.h b/arch/powerpc/perf/callchain.h
index ae24d4a00da6..d6fa6e25234f 100644
--- a/arch/powerpc/perf/callchain.h
+++ b/arch/powerpc/perf/callchain.h
@@ -33,7 +33,7 @@ static inline int __read_user_stack(const void __user *ptr, void *ret,
rc = copy_from_user_nofault(ret, ptr, size);
- if (IS_ENABLED(CONFIG_PPC64) && rc)
+ if (IS_ENABLED(CONFIG_PPC64) && !radix_enabled() && rc)
return read_user_stack_slow(ptr, ret, size);
return rc;