x86/mm/init.c: Fix devmem_is_allowed() off by one
[pandora-kernel.git] / arch / x86 / mm / init.c
index 7ab2eae..222f5b7 100644 (file)
@@ -44,11 +44,15 @@ static void __init find_early_table_space(struct map_range *mr, int nr_range)
        int i;
        unsigned long puds = 0, pmds = 0, ptes = 0, tables;
        unsigned long start = 0, good_end;
+       unsigned long pgd_extra = 0;
        phys_addr_t base;
 
        for (i = 0; i < nr_range; i++) {
                unsigned long range, extra;
 
+               if ((mr[i].end >> PGDIR_SHIFT) - (mr[i].start >> PGDIR_SHIFT))
+                       pgd_extra++;
+
                range = mr[i].end - mr[i].start;
                puds += (range + PUD_SIZE - 1) >> PUD_SHIFT;
 
@@ -64,10 +68,6 @@ static void __init find_early_table_space(struct map_range *mr, int nr_range)
 #ifdef CONFIG_X86_32
                        extra += PMD_SIZE;
 #endif
-                       /* The first 2/4M doesn't use large pages. */
-                       if (mr[i].start < PMD_SIZE)
-                               extra += range;
-
                        ptes += (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
                } else {
                        ptes += (range + PAGE_SIZE - 1) >> PAGE_SHIFT;
@@ -77,6 +77,7 @@ static void __init find_early_table_space(struct map_range *mr, int nr_range)
        tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);
        tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);
        tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE);
+       tables += (pgd_extra * PAGE_SIZE);
 
 #ifdef CONFIG_X86_32
        /* for fixmap */
@@ -325,7 +326,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
  */
 int devmem_is_allowed(unsigned long pagenr)
 {
-       if (pagenr <= 256)
+       if (pagenr < 256)
                return 1;
        if (iomem_is_exclusive(pagenr << PAGE_SHIFT))
                return 0;