sparc64: Ensure perf can access user stacks
authorRob Gardner <rob.gardner@oracle.com>
Wed, 23 Dec 2015 04:16:06 +0000 (21:16 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 24 Dec 2015 17:10:29 +0000 (12:10 -0500)
commit3f74306ac84cf7f2da2fdc87014fc455f5e67bad
tree84ca393a2bf06e0d8fdc085689c663697dc01e30
parent1ca04a4ce0d5131471c5a1fac76899dc2d9d3f36
sparc64: Ensure perf can access user stacks

When an interrupt (such as a perf counter interrupt) is delivered
while executing in user space, the trap entry code puts ASI_AIUS in
%asi so that copy_from_user() and copy_to_user() will access the
correct memory. But if a perf counter interrupt is delivered while the
cpu is already executing in kernel space, then the trap entry code
will put ASI_P in %asi, and this will prevent copy_from_user() from
reading any useful stack data in either of the perf_callchain_user_X
functions, and thus no user callgraph data will be collected for this
sample period. An additional problem is that a fault is guaranteed
to occur, and though it will be silently covered up, it wastes time
and could perturb state.

In perf_callchain_user(), we ensure that %asi contains ASI_AIUS
because we know for a fact that the subsequent calls to
copy_from_user() are intended to read the user's stack.

[ Use get_fs()/set_fs() -DaveM ]

Signed-off-by: Rob Gardner <rob.gardner@oracle.com>
Signed-off-by: Dave Aldridge <david.j.aldridge@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/perf_event.c