• Rob Gardner's avatar
    sparc64: Ensure perf can access user stacks · 3f74306a
    Rob Gardner authored
    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: default avatarRob Gardner <rob.gardner@oracle.com>
    Signed-off-by: default avatarDave Aldridge <david.j.aldridge@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3f74306a
perf_event.c 45.5 KB