• Ravi Bangoria's avatar
    powerpc/perf: Fix oops when kthread execs user process · bf05fc25
    Ravi Bangoria authored
    When a kthread calls call_usermodehelper() the steps are:
      1. allocate current->mm
      2. load_elf_binary()
      3. populate current->thread.regs
    
    While doing this, interrupts are not disabled. If there is a perf
    interrupt in the middle of this process (i.e. step 1 has completed
    but not yet reached to step 3) and if perf tries to read userspace
    regs, kernel oops with following log:
    
      Unable to handle kernel paging request for data at address 0x00000000
      Faulting instruction address: 0xc0000000000da0fc
      ...
      Call Trace:
      perf_output_sample_regs+0x6c/0xd0
      perf_output_sample+0x4e4/0x830
      perf_event_output_forward+0x64/0x90
      __perf_event_overflow+0x8c/0x1e0
      record_and_restart+0x220/0x5c0
      perf_event_interrupt+0x2d8/0x4d0
      performance_monitor_exception+0x54/0x70
      performance_monitor_common+0x158/0x160
      --- interrupt: f01 at avtab_search_node+0x150/0x1a0
          LR = avtab_search_node+0x100/0x1a0
      ...
      load_elf_binary+0x6e8/0x15a0
      search_binary_handler+0xe8/0x290
      do_execveat_common.isra.14+0x5f4/0x840
      call_usermodehelper_exec_async+0x170/0x210
      ret_from_kernel_thread+0x5c/0x7c
    
    Fix it by setting abi to PERF_SAMPLE_REGS_ABI_NONE when userspace
    pt_regs are not set.
    
    Fixes: ed4a4ef8 ("powerpc/perf: Add support for sampling interrupt register state")
    Cc: stable@vger.kernel.org # v4.7+
    Signed-off-by: default avatarRavi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
    Acked-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    bf05fc25
perf_regs.c 3.48 KB