ARM: 7304/1: ioremap: fix boundary check when reusing static mapping
authorPawel Moll <pawel.moll@arm.com>
Thu, 26 Jan 2012 10:47:11 +0000 (11:47 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 27 Jan 2012 21:26:38 +0000 (21:26 +0000)
Since commit 576d2f2525612ecb5af029a76f21f22a3b82563d "ARM: add
generic ioremap optimization by reusing static mappings" ioremap()
is trying to reuse existing static mapping when possible.

The condition checking boundaries of the requested and existing
mappings didn't take in-page offset into consideration though,
which lead to obscure and hard to debug problems when requested
mapping crossed end of the static one.

Signed-off-by: Pawel Moll <pawel.moll@arm.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/ioremap.c

index 80632e8d7538f33d5a6539df5a72a90fff52e7ec..ba159370fa5f710633d6b00a078c23bc40ad6f6a 100644 (file)
@@ -225,7 +225,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
                if ((area->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype))
                        continue;
                if (__phys_to_pfn(area->phys_addr) > pfn ||
-                   __pfn_to_phys(pfn) + size-1 > area->phys_addr + area->size-1)
+                   __pfn_to_phys(pfn) + offset + size-1 >
+                   area->phys_addr + area->size-1)
                        continue;
                /* we can drop the lock here as we know *area is static */
                read_unlock(&vmlist_lock);