Commit 0368dfd01ae3b7647ef9b2f0525fdefd5e0d28e1
Committed by
Linus Torvalds
1 parent
0e47c969c6
Exists in
master
and in
16 other branches
lib/genalloc.c: add check gen_pool_dma_alloc() if dma pointer is not NULL
In the gen_pool_dma_alloc() the dma pointer can be NULL and while assigning gen_pool_virt_to_phys(pool, vaddr) to dma caused the following crash on da850 evm: Unable to handle kernel NULL pointer dereference at virtual address 00000000 Internal error: Oops: 805 [#1] PREEMPT ARM Modules linked in: CPU: 0 PID: 1 Comm: swapper Tainted: G W 3.13.0-rc1-00001-g0609e45-dirty #5 task: c4830000 ti: c4832000 task.ti: c4832000 PC is at gen_pool_dma_alloc+0x30/0x3c LR is at gen_pool_virt_to_phys+0x74/0x80 Process swapper, call trace: gen_pool_dma_alloc+0x30/0x3c davinci_pm_probe+0x40/0xa8 platform_drv_probe+0x1c/0x4c driver_probe_device+0x98/0x22c __driver_attach+0x8c/0x90 bus_for_each_dev+0x6c/0x8c bus_add_driver+0x124/0x1d4 driver_register+0x78/0xf8 platform_driver_probe+0x20/0xa4 davinci_init_late+0xc/0x14 init_machine_late+0x1c/0x28 do_one_initcall+0x34/0x15c kernel_init_freeable+0xe4/0x1ac kernel_init+0x8/0xec This patch fixes the above. [akpm@linux-foundation.org: update kerneldoc] Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Cc: Philipp Zabel <p.zabel@pengutronix.de> Cc: Nicolin Chen <b42378@freescale.com> Cc: Joe Perches <joe@perches.com> Cc: Sachin Kamat <sachin.kamat@linaro.org> Cc: <stable@vger.kernel.org> [3.13.x] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 3 additions and 2 deletions Side-by-side Diff
lib/genalloc.c
... | ... | @@ -316,7 +316,7 @@ |
316 | 316 | * gen_pool_dma_alloc - allocate special memory from the pool for DMA usage |
317 | 317 | * @pool: pool to allocate from |
318 | 318 | * @size: number of bytes to allocate from the pool |
319 | - * @dma: dma-view physical address | |
319 | + * @dma: dma-view physical address return value. Use NULL if unneeded. | |
320 | 320 | * |
321 | 321 | * Allocate the requested number of bytes from the specified pool. |
322 | 322 | * Uses the pool allocation function (with first-fit algorithm by default). |
... | ... | @@ -334,7 +334,8 @@ |
334 | 334 | if (!vaddr) |
335 | 335 | return NULL; |
336 | 336 | |
337 | - *dma = gen_pool_virt_to_phys(pool, vaddr); | |
337 | + if (dma) | |
338 | + *dma = gen_pool_virt_to_phys(pool, vaddr); | |
338 | 339 | |
339 | 340 | return (void *)vaddr; |
340 | 341 | } |