| From dhobsong@igel.co.jp Mon Oct 29 00:54:08 2012 |
| From: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| Date: Mon, 29 Oct 2012 16:51:13 +0900 |
| Subject: [PATCH v2 56/58] arm: mm: fix DMA pool affiliation check |
| 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-57-git-send-email-dhobsong@igel.co.jp> |
| |
| |
| From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| |
| The __free_from_pool() function was changed in |
| e9da6e9905e639b0f842a244bc770b48ad0523e9. Unfortunately, the test that |
| checks whether the provided (start,size) is within the DMA pool has |
| been improperly modified. It used to be: |
| |
| if (start < coherent_head.vm_start || end > coherent_head.vm_end) |
| |
| Where coherent_head.vm_end was non-inclusive (i.e, it did not include |
| the first byte after the pool). The test has been changed to: |
| |
| if (start < pool->vaddr || start > pool->vaddr + pool->size) |
| |
| So now pool->vaddr + pool->size is inclusive (i.e, it includes the |
| first byte after the pool), so the test should be >= instead of >. |
| |
| This bug causes the following message when freeing the *first* DMA |
| coherent buffer that has been allocated, because its virtual address |
| is exactly equal to pool->vaddr + pool->size : |
| |
| WARNING: at /home/thomas/projets/linux-2.6/arch/arm/mm/dma-mapping.c:463 __free_from_pool+0xa4/0xc0() |
| freeing wrong coherent size from pool |
| |
| Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| Cc: Marek Szyprowski <m.szyprowski@samsung.com> |
| Cc: Russell King <linux@arm.linux.org.uk> |
| Cc: Lior Amsalem <alior@marvell.com> |
| Cc: Maen Suleiman <maen@marvell.com> |
| Cc: Tawfik Bayouk <tawfik@marvell.com> |
| Cc: Shadi Ammouri <shadi@marvell.com> |
| Cc: Eran Ben-Avi <benavi@marvell.com> |
| Cc: Yehuda Yitschak <yehuday@marvell.com> |
| Cc: Nadav Haklai <nadavh@marvell.com> |
| [m.szyprowski: rebased onto v3.6-rc5 and resolved conflict] |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| (cherry picked from commit f3d87524975f01b885fc3d009c6ab6afd0d00746) |
| |
| Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| --- |
| arch/arm/mm/dma-mapping.c | 2 +- |
| 1 files changed, 1 insertions(+), 1 deletions(-) |
| |
| diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
| index 94b7b78..dc16881 100644 |
| --- a/arch/arm/mm/dma-mapping.c |
| +++ b/arch/arm/mm/dma-mapping.c |
| @@ -477,7 +477,7 @@ static bool __in_atomic_pool(void *start, size_t size) |
| void *pool_start = pool->vaddr; |
| void *pool_end = pool->vaddr + pool->size; |
| |
| - if (start < pool_start || start > pool_end) |
| + if (start < pool_start || start >= pool_end) |
| return false; |
| |
| if (end <= pool_end) |
| -- |
| 1.7.5.4 |
| |