alistair23-linux/arch
Michael Ellerman 6772faa1ba powerpc/perf: Fix deadlock caused by calling printk() in PMU exception
In commit bc09c21 "Fix finding overflowed PMC in interrupt" we added
a printk() to the PMU exception handler. Unfortunately that is not safe.

The problem is that the PMU exception may run even when interrupts are
soft disabled, aka NMI context. We do this so that we can profile parts
of the kernel that have interrupts soft-disabled.

But by calling printk() from the exception handler, we can potentially
deadlock in the printk code on logbuf_lock, eg:

  [c00000038ba575c0] c000000000081928 .vprintk_emit+0xa8/0x540
  [c00000038ba576a0] c0000000007bcde8 .printk+0x48/0x58
  [c00000038ba57710] c000000000076504 .perf_event_interrupt+0x2d4/0x490
  [c00000038ba57810] c00000000001f6f8 .performance_monitor_exception+0x48/0x60
  [c00000038ba57880] c0000000000032cc performance_monitor_common+0x14c/0x180
  --- Exception: f01 (Performance Monitor) at c0000000007b25d4 ._raw_spin_lock_irq
  +0x64/0xc0
  [c00000038ba57bf0] c00000000007ed90 .devkmsg_read+0xd0/0x5a0
  [c00000038ba57d00] c0000000001c2934 .vfs_read+0xc4/0x1e0
  [c00000038ba57d90] c0000000001c2cd8 .SyS_read+0x58/0xd0
  [c00000038ba57e30] c000000000009d54 syscall_exit+0x0/0x98
  --- Exception: c01 (System Call) at 00001fffffbf6f7c
  SP (3ffff6d4de10) is in userspace

Fix it by making sure we only call printk() when we are not in NMI
context.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Cc: <stable@vger.kernel.org> # 3.9
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2013-06-10 08:36:32 +10:00
..
alpha
arc ARC: lazy dcache flush broke gdb in non-aliasing configs 2013-05-25 14:15:55 +05:30
arm arch, mm: Remove tlb_fast_mode() 2013-06-06 10:07:26 +09:00
arm64 arm64: don't kill the kernel on a bad esr from el0 2013-05-31 16:04:51 +01:00
avr32 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/egtvedt/linux-avr32 2013-05-22 18:06:57 -07:00
blackfin
c6x
cris
frv
h8300
hexagon
ia64 arch, mm: Remove tlb_fast_mode() 2013-06-06 10:07:26 +09:00
m32r
m68k Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k 2013-06-03 18:09:42 +09:00
metag
microblaze microblaze: Use static inline functions in cacheflush.h 2013-06-03 11:33:23 +02:00
mips mips/kvm: Use ENOIOCTLCMD to indicate unimplemented ioctls. 2013-06-03 10:58:55 +03:00
mn10300 MN10300: Need pci_iomap() and __pci_ioport_map() defining 2013-05-30 13:38:48 +09:00
openrisc
parisc parisc: kernel: using strlcpy() instead of strcpy() 2013-06-01 14:29:01 +02:00
powerpc powerpc/perf: Fix deadlock caused by calling printk() in PMU exception 2013-06-10 08:36:32 +10:00
s390 s390/pgtable: Fix gmap notifier address 2013-05-31 17:23:53 +02:00
score score: remove redundant kcore_list entries 2013-05-25 10:27:27 -07:00
sh
sparc
tile
um
unicore32
x86 PCI update for v3.10: 2013-06-06 16:28:15 -07:00
xtensa
.gitignore
Kconfig Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2013-05-15 14:04:00 -07:00