diff options
author | Helge Deller <deller@gmx.de> | 2008-12-17 17:57:34 -0500 |
---|---|---|
committer | Kyle McMartin <kyle@mcmartin.ca> | 2009-01-05 13:15:25 -0500 |
commit | e0e7ed4811ce32d48ca8ee9fd136357d093243a9 (patch) | |
tree | 78c8f476190a93e8319989855ac3fd81ff40bd7f /arch/parisc/kernel/unwind.c | |
parent | 0063507787ee7b385a8cbe7521469acf33341eb6 (diff) |
parisc: fix GFP_KERNEL use while atomic in unwinder
Since unwind_frame_init_from_blocked_task() may be called from
interrupt/in_atomic context, it needs to kmalloc() memory with
GFP_ATOMIC instead of GFP_KERNEL.
This fixes this warning (ShowTasks called from sysrq handler):
BUG: sleeping function called from invalid context at mm/slab.c:3044
in_atomic(): 1, irqs_disabled(): 1, pid: 2119, name: miniruby
Backtrace:
[<10132e78>] __might_sleep+0x4c/0x118
[<1018f644>] kmem_cache_alloc+0x2c/0xb4
[<1011bae0>] unwind_frame_init_from_blocked_task+0x30/0xa0
[<1010fd3c>] parisc_show_stack+0x3c/0xac
[<10132c7c>] show_state_filter+0x80/0xd8
[<102f4074>] __handle_sysrq+0xd0/0x1b0
[<102f9558>] receive_chars+0x22c/0x318
[<102f9940>] serial8250_handle_port+0x40/0x88
[<102f9a8c>] serial8250_interrupt+0x104/0x10c
[<10161920>] handle_IRQ_event+0x44/0x94
[<10161acc>] __do_IRQ+0x15c/0x1dc
[<102c442c>] superio_interrupt+0x74/0xa8
[<10161920>] handle_IRQ_event+0x44/0x94
[<10161acc>] __do_IRQ+0x15c/0x1dc
[<10110fb4>] do_cpu_irq_mask+0x90/0xbc
[<10114068>] intr_return+0x0/0x4
Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
Diffstat (limited to 'arch/parisc/kernel/unwind.c')
-rw-r--r-- | arch/parisc/kernel/unwind.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index 6773c582e457..69dad5a850a8 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
@@ -372,7 +372,7 @@ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct | |||
372 | struct pt_regs *r = &t->thread.regs; | 372 | struct pt_regs *r = &t->thread.regs; |
373 | struct pt_regs *r2; | 373 | struct pt_regs *r2; |
374 | 374 | ||
375 | r2 = kmalloc(sizeof(struct pt_regs), GFP_KERNEL); | 375 | r2 = kmalloc(sizeof(struct pt_regs), GFP_ATOMIC); |
376 | if (!r2) | 376 | if (!r2) |
377 | return; | 377 | return; |
378 | *r2 = *r; | 378 | *r2 = *r; |