This patch uses the optimized ioresource lookup, "region_is_ram", for
the ioremap function.  If the region is not found, it falls back to the
"page_is_ram" function.  If it is found and it is RAM, then the usual
warning message is issued, and the ioremap operation is aborted.
Otherwise, the ioremap operation continues.

Signed-off-by: Mike Travis <tra...@sgi.com>
Acked-by: Alex Thorlton <athorl...@sgi.com>
Reviewed-by: Cliff Wickman <c...@sgi.com>
Cc: <sta...@vger.kernel.org>
---
v2: slight rearrangement of code
v3: added Cc: stable
---
 arch/x86/mm/ioremap.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

--- linux.orig/arch/x86/mm/ioremap.c
+++ linux/arch/x86/mm/ioremap.c
@@ -86,6 +86,7 @@ static void __iomem *__ioremap_caller(re
        pgprot_t prot;
        int retval;
        void __iomem *ret_addr;
+       int ram_region;
 
        /* Don't allow wraparound or zero size */
        last_addr = phys_addr + size - 1;
@@ -108,12 +109,23 @@ static void __iomem *__ioremap_caller(re
        /*
         * Don't allow anybody to remap normal RAM that we're using..
         */
-       pfn      = phys_addr >> PAGE_SHIFT;
-       last_pfn = last_addr >> PAGE_SHIFT;
-       if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
-                                 __ioremap_check_ram) == 1)
+       /* First check if whole region can be identified as RAM or not */
+       ram_region = region_is_ram(phys_addr, size);
+       if (ram_region > 0) {
+               WARN_ONCE(1, "ioremap on RAM at 0x%lx - 0x%lx\n",
+                               (unsigned long int)phys_addr,
+                               (unsigned long int)last_addr);
                return NULL;
+       }
 
+       /* If could not be identified(-1), check page by page */
+       if (ram_region < 0) {
+               pfn      = phys_addr >> PAGE_SHIFT;
+               last_pfn = last_addr >> PAGE_SHIFT;
+               if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
+                                         __ioremap_check_ram) == 1)
+                       return NULL;
+       }
        /*
         * Mappings have to be page-aligned
         */

-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to