riscv: __asm_copy_to-from_user: Fix: overrun copy
[linux-2.6-microblaze.git] / mm / memblock.c
index 3e4acbf..0041ff6 100644 (file)
@@ -182,6 +182,8 @@ bool __init_memblock memblock_overlaps_region(struct memblock_type *type,
 {
        unsigned long i;
 
+       memblock_cap_size(base, &size);
+
        for (i = 0; i < type->cnt; i++)
                if (memblock_addrs_overlap(base, size, type->regions[i].base,
                                           type->regions[i].size))
@@ -1799,7 +1801,6 @@ bool __init_memblock memblock_is_region_memory(phys_addr_t base, phys_addr_t siz
  */
 bool __init_memblock memblock_is_region_reserved(phys_addr_t base, phys_addr_t size)
 {
-       memblock_cap_size(base, &size);
        return memblock_overlaps_region(&memblock.reserved, base, size);
 }
 
@@ -1946,14 +1947,13 @@ static void __init free_unused_memmap(void)
                 * due to SPARSEMEM sections which aren't present.
                 */
                start = min(start, ALIGN(prev_end, PAGES_PER_SECTION));
-#else
+#endif
                /*
-                * Align down here since the VM subsystem insists that the
-                * memmap entries are valid from the bank start aligned to
-                * MAX_ORDER_NR_PAGES.
+                * Align down here since many operations in VM subsystem
+                * presume that there are no holes in the memory map inside
+                * a pageblock
                 */
-               start = round_down(start, MAX_ORDER_NR_PAGES);
-#endif
+               start = round_down(start, pageblock_nr_pages);
 
                /*
                 * If we had a previous bank, and there is a space
@@ -1963,16 +1963,18 @@ static void __init free_unused_memmap(void)
                        free_memmap(prev_end, start);
 
                /*
-                * Align up here since the VM subsystem insists that the
-                * memmap entries are valid from the bank end aligned to
-                * MAX_ORDER_NR_PAGES.
+                * Align up here since many operations in VM subsystem
+                * presume that there are no holes in the memory map inside
+                * a pageblock
                 */
-               prev_end = ALIGN(end, MAX_ORDER_NR_PAGES);
+               prev_end = ALIGN(end, pageblock_nr_pages);
        }
 
 #ifdef CONFIG_SPARSEMEM
-       if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION))
+       if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION)) {
+               prev_end = ALIGN(end, pageblock_nr_pages);
                free_memmap(prev_end, ALIGN(prev_end, PAGES_PER_SECTION));
+       }
 #endif
 }