• Rob Gardner's avatar
    sparc64: Perf should save/restore fault info · 83352694
    Rob Gardner authored
    There have been several reports of random processes being killed with
    a bus error or segfault during userspace stack walking in perf.  One
    of the root causes of this problem is an asynchronous modification to
    thread_info fault_address and fault_code, which stems from a perf
    counter interrupt arriving during kernel processing of a "benign"
    fault, such as a TSB miss. Since perf_callchain_user() invokes
    copy_from_user() to read user stacks, a fault is not only possible,
    but probable. Validity checks on the stack address merely cover up the
    problem and reduce its frequency.
    
    The solution here is to save and restore fault_address and fault_code
    in perf_callchain_user() so that the benign fault handler is not
    disturbed by a perf interrupt.
    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>
    83352694
perf_event.c 45.7 KB