| From dhobsong@igel.co.jp Mon Oct 29 00:53:53 2012 |
| From: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| Date: Mon, 29 Oct 2012 16:51:07 +0900 |
| Subject: [PATCH v2 50/58] ARM: dma-mapping: fix atomic allocation alignment |
| To: greg@kroah.com, laurent.pinchart@ideasonboard.com, horms@verge.net.au |
| Cc: ltsi-dev@lists.linuxfoundation.org, dhobsong@igel.co.jp |
| Message-ID: <1351497075-32717-51-git-send-email-dhobsong@igel.co.jp> |
| |
| |
| From: Aaro Koskinen <aaro.koskinen@iki.fi> |
| |
| The alignment mask is calculated incorrectly. Fixing the calculation |
| makes strange hangs/lockups disappear during the boot with Amstrad E3 |
| and 3.6-rc1 kernel. |
| |
| Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| (cherry picked from commit e4ea6918c93b9f59d34e8ca2124b2b64b1afe73b) |
| |
| Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| --- |
| arch/arm/mm/dma-mapping.c | 6 +++--- |
| 1 files changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
| index 1ce34ba..80491d3 100644 |
| --- a/arch/arm/mm/dma-mapping.c |
| +++ b/arch/arm/mm/dma-mapping.c |
| @@ -422,7 +422,7 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) |
| unsigned int pageno; |
| unsigned long flags; |
| void *ptr = NULL; |
| - size_t align; |
| + unsigned long align_mask; |
| |
| if (!pool->vaddr) { |
| WARN(1, "coherent pool not initialised!\n"); |
| @@ -434,11 +434,11 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) |
| * small, so align them to their order in pages, minimum is a page |
| * size. This helps reduce fragmentation of the DMA space. |
| */ |
| - align = PAGE_SIZE << get_order(size); |
| + align_mask = (1 << get_order(size)) - 1; |
| |
| spin_lock_irqsave(&pool->lock, flags); |
| pageno = bitmap_find_next_zero_area(pool->bitmap, pool->nr_pages, |
| - 0, count, (1 << align) - 1); |
| + 0, count, align_mask); |
| if (pageno < pool->nr_pages) { |
| bitmap_set(pool->bitmap, pageno, count); |
| ptr = pool->vaddr + PAGE_SIZE * pageno; |
| -- |
| 1.7.5.4 |
| |