| From edc530fe7ee5a562680615d2e7cd205879c751a7 Mon Sep 17 00:00:00 2001 |
| From: Michael Grzeschik <m.grzeschik@pengutronix.de> |
| Date: Tue, 17 Sep 2013 15:56:06 +0200 |
| Subject: dmaengine: imx-dma: fix slow path issue in prep_dma_cyclic |
| |
| From: Michael Grzeschik <m.grzeschik@pengutronix.de> |
| |
| commit edc530fe7ee5a562680615d2e7cd205879c751a7 upstream. |
| |
| When perparing cyclic_dma buffers by the sound layer, it will dump the |
| following lockdep trace. The leading snd_pcm_action_single get called |
| with read_lock_irq called. To fix this, we change the kcalloc call from |
| GFP_KERNEL to GFP_ATOMIC. |
| |
| WARNING: at kernel/lockdep.c:2740 lockdep_trace_alloc+0xcc/0x114() |
| DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags)) |
| Modules linked in: |
| CPU: 0 PID: 832 Comm: aplay Not tainted 3.11.0-20130823+ #903 |
| Backtrace: |
| [<c000b98c>] (dump_backtrace+0x0/0x10c) from [<c000bb28>] (show_stack+0x18/0x1c) |
| r6:c004c090 r5:00000009 r4:c2e0bd18 r3:00404000 |
| [<c000bb10>] (show_stack+0x0/0x1c) from [<c02f397c>] (dump_stack+0x20/0x28) |
| [<c02f395c>] (dump_stack+0x0/0x28) from [<c001531c>] (warn_slowpath_common+0x54/0x70) |
| [<c00152c8>] (warn_slowpath_common+0x0/0x70) from [<c00153dc>] (warn_slowpath_fmt+0x38/0x40) |
| r8:00004000 r7:a3b90000 r6:000080d0 r5:60000093 r4:c2e0a000 r3:00000009 |
| [<c00153a4>] (warn_slowpath_fmt+0x0/0x40) from [<c004c090>] (lockdep_trace_alloc+0xcc/0x114) |
| r3:c03955d8 r2:c03907db |
| [<c004bfc4>] (lockdep_trace_alloc+0x0/0x114) from [<c008f16c>] (__kmalloc+0x34/0x118) |
| r6:000080d0 r5:c3800120 r4:000080d0 r3:c040a0f8 |
| [<c008f138>] (__kmalloc+0x0/0x118) from [<c019c95c>] (imxdma_prep_dma_cyclic+0x64/0x168) |
| r7:a3b90000 r6:00000004 r5:c39d8420 r4:c3847150 |
| [<c019c8f8>] (imxdma_prep_dma_cyclic+0x0/0x168) from [<c024618c>] (snd_dmaengine_pcm_trigger+0xa8/0x160) |
| [<c02460e4>] (snd_dmaengine_pcm_trigger+0x0/0x160) from [<c0241fa8>] (soc_pcm_trigger+0x90/0xb4) |
| r8:c058c7b0 r7:c3b8140c r6:c39da560 r5:00000001 r4:c3b81000 |
| [<c0241f18>] (soc_pcm_trigger+0x0/0xb4) from [<c022ece4>] (snd_pcm_do_start+0x2c/0x38) |
| r7:00000000 r6:00000003 r5:c058c7b0 r4:c3b81000 |
| [<c022ecb8>] (snd_pcm_do_start+0x0/0x38) from [<c022e958>] (snd_pcm_action_single+0x40/0x6c) |
| [<c022e918>] (snd_pcm_action_single+0x0/0x6c) from [<c022ea64>] (snd_pcm_action_lock_irq+0x7c/0x9c) |
| r7:00000003 r6:c3b810f0 r5:c3b810f0 r4:c3b81000 |
| [<c022e9e8>] (snd_pcm_action_lock_irq+0x0/0x9c) from [<c023009c>] (snd_pcm_common_ioctl1+0x7f8/0xfd0) |
| r8:c3b7f888 r7:005407b8 r6:c2c991c0 r5:c3b81000 r4:c3b81000 r3:00004142 |
| [<c022f8a4>] (snd_pcm_common_ioctl1+0x0/0xfd0) from [<c023117c>] (snd_pcm_playback_ioctl1+0x464/0x488) |
| [<c0230d18>] (snd_pcm_playback_ioctl1+0x0/0x488) from [<c02311d4>] (snd_pcm_playback_ioctl+0x34/0x40) |
| r8:c3b7f888 r7:00004142 r6:00000004 r5:c2c991c0 r4:005407b8 |
| [<c02311a0>] (snd_pcm_playback_ioctl+0x0/0x40) from [<c00a14a4>] (vfs_ioctl+0x30/0x44) |
| [<c00a1474>] (vfs_ioctl+0x0/0x44) from [<c00a1fe8>] (do_vfs_ioctl+0x55c/0x5c0) |
| [<c00a1a8c>] (do_vfs_ioctl+0x0/0x5c0) from [<c00a208c>] (SyS_ioctl+0x40/0x68) |
| [<c00a204c>] (SyS_ioctl+0x0/0x68) from [<c0009380>] (ret_fast_syscall+0x0/0x44) |
| r8:c0009544 r7:00000036 r6:bedeaa58 r5:00000000 r4:000000c0 |
| |
| Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> |
| Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
| Cc: Jonghwan Choi <jhbird.choi@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/dma/imx-dma.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/dma/imx-dma.c |
| +++ b/drivers/dma/imx-dma.c |
| @@ -884,7 +884,7 @@ static struct dma_async_tx_descriptor *i |
| kfree(imxdmac->sg_list); |
| |
| imxdmac->sg_list = kcalloc(periods + 1, |
| - sizeof(struct scatterlist), GFP_KERNEL); |
| + sizeof(struct scatterlist), GFP_ATOMIC); |
| if (!imxdmac->sg_list) |
| return NULL; |
| |