linux_dsm_epyc7002/arch/powerpc
Ravi Bangoria fb822e6076 powerpc/hw_breakpoint: Fix oops when destroying hw_breakpoint event
When destroying a hw_breakpoint event, the kernel oopses as follows:

  Unable to handle kernel paging request for data at address 0x00000c07
  NIP [c0000000000291d0] arch_unregister_hw_breakpoint+0x40/0x60
  LR [c00000000020b6b4] release_bp_slot+0x44/0x80

Call chain:

  hw_breakpoint_event_init()
    bp->destroy = bp_perf_event_destroy;

  do_exit()
    perf_event_exit_task()
      perf_event_exit_task_context()
        WRITE_ONCE(child_ctx->task, TASK_TOMBSTONE);
        perf_event_exit_event()
          free_event()
            _free_event()
              bp_perf_event_destroy() // event->destroy(event);
                release_bp_slot()
                  arch_unregister_hw_breakpoint()

perf_event_exit_task_context() sets child_ctx->task as TASK_TOMBSTONE
which is (void *)-1. arch_unregister_hw_breakpoint() tries to fetch
'thread' attribute of 'task' resulting in oops.

Peterz points out that the code shouldn't be using bp->ctx anyway, but
fixing that will require a decent amount of rework. So for now to fix
the oops, check if bp->ctx->task has been set to (void *)-1, before
dereferencing it. We don't use TASK_TOMBSTONE, because that would
require exporting it and it's supposed to be an internal detail.

Fixes: 63b6da39bb ("perf: Fix perf_event_exit_task() race")
Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2016-03-03 22:06:08 +11:00
..
boot powerpc updates for 4.5 2016-01-15 13:18:47 -08:00
configs powerpc/85xx: Enable TWR_P102x in mpc85xx_basic_defconfig 2015-12-22 18:23:21 -06:00
crypto powerpc: Create disable_kernel_{fp,altivec,vsx,spe}() 2015-12-01 13:52:25 +11:00
include powerpc/mm: Fix Multi hit ERAT cause by recent THP update 2016-02-15 21:10:04 +11:00
kernel powerpc/hw_breakpoint: Fix oops when destroying hw_breakpoint event 2016-03-03 22:06:08 +11:00
kvm kvm: rename pfn_t to kvm_pfn_t 2016-01-15 17:56:32 -08:00
lib powerpc: Create disable_kernel_{fp,altivec,vsx,spe}() 2015-12-01 13:52:25 +11:00
math-emu
mm powerpc/mm/hash: Clear the invalid slot information correctly 2016-02-22 19:27:39 +11:00
net net: filter: make JITs zero A for SKF_AD_ALU_XOR_X 2016-01-06 00:43:52 -05:00
oprofile powerpc: Remove mtmsrd(), use existing mtmsr() 2015-07-13 15:47:28 +10:00
perf powerpc/perf: Remove PPMU_HAS_SSLOT flag for Power8 2016-01-28 23:48:35 +11:00
platforms powerpc/ioda: Set "read" permission when "write" is set 2016-02-17 23:52:17 +11:00
sysdev mm, dax, pmem: introduce pfn_t 2016-01-15 17:56:32 -08:00
xmon powerpc/xmon: Use rtas_call_unlocked() in xmon 2015-12-17 22:40:55 +11:00
Kconfig powerpc/book3s_32: Fix build error with checkpoint restart 2016-01-31 15:08:06 +11:00
Kconfig.debug powerpc updates for 4.5 2016-01-15 13:18:47 -08:00
Makefile powerpc/cell: Drop CONFIG_TUNE_CELL in favour of CONFIG_CELL_CPU 2015-10-19 19:51:18 +11:00
relocs_check.sh powerpc: Convert relocs_check to a shell script using grep 2015-03-23 14:47:39 +11:00