ARM: DMA: Fix struct page iterator in dma_cache_maint() to work with sparsemem
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 19 Jan 2013 11:05:57 +0000 (11:05 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 19 Jan 2013 11:05:57 +0000 (11:05 +0000)
commit15653371c67c3fbe359ae37b720639dd4c7b42c5
treee92cba77b7796993d2cce4af22b9022196c9211a
parent6f16f4998f98e42e3f2dedf663cfb691ff0324af
ARM: DMA: Fix struct page iterator in dma_cache_maint() to work with sparsemem

Subhash Jadavani reported this partial backtrace:
  Now consider this call stack from MMC block driver (this is on the ARMv7
  based board):

  [<c001b50c>] (v7_dma_inv_range+0x30/0x48) from [<c0017b8c>] (dma_cache_maint_page+0x1c4/0x24c)
  [<c0017b8c>] (dma_cache_maint_page+0x1c4/0x24c) from [<c0017c28>] (___dma_page_cpu_to_dev+0x14/0x1c)
  [<c0017c28>] (___dma_page_cpu_to_dev+0x14/0x1c) from [<c0017ff8>] (dma_map_sg+0x3c/0x114)

This is caused by incrementing the struct page pointer, and running off
the end of the sparsemem page array.  Fix this by incrementing by pfn
instead, and convert the pfn to a struct page.

Cc: <stable@vger.kernel.org>
Suggested-by: James Bottomley <JBottomley@Parallels.com>
Tested-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/dma-mapping.c