Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb...
[deliverable/linux.git] / mm / memblock.c
index 625905523c2a1592f539c46f6721723d62376648..b8d9147e5c084de3264fc49ea93c95e22eddf49d 100644 (file)
@@ -314,7 +314,8 @@ static void __init_memblock memblock_merge_regions(struct memblock_type *type)
                }
 
                this->size += next->size;
-               memmove(next, next + 1, (type->cnt - (i + 1)) * sizeof(*next));
+               /* move forward from next + 1, index of which is i + 2 */
+               memmove(next, next + 1, (type->cnt - (i + 2)) * sizeof(*next));
                type->cnt--;
        }
 }
@@ -827,6 +828,23 @@ phys_addr_t __init memblock_phys_mem_size(void)
        return memblock.memory.total_size;
 }
 
+phys_addr_t __init memblock_mem_size(unsigned long limit_pfn)
+{
+       unsigned long pages = 0;
+       struct memblock_region *r;
+       unsigned long start_pfn, end_pfn;
+
+       for_each_memblock(memory, r) {
+               start_pfn = memblock_region_memory_base_pfn(r);
+               end_pfn = memblock_region_memory_end_pfn(r);
+               start_pfn = min_t(unsigned long, start_pfn, limit_pfn);
+               end_pfn = min_t(unsigned long, end_pfn, limit_pfn);
+               pages += end_pfn - start_pfn;
+       }
+
+       return (phys_addr_t)pages << PAGE_SHIFT;
+}
+
 /* lowest address */
 phys_addr_t __init_memblock memblock_start_of_DRAM(void)
 {
This page took 0.03204 seconds and 5 git commands to generate.