static unsigned long __init free_low_memory_core_early(void) { unsigned long count = 0; phys_addr_t start, end; u64 i; memblock_clear_hotplug(0, -1); for_each_reserved_mem_region(i, &start, &end) reserve_bootmem_region(start, end); for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end, NULL) count += __free_memory_core(start, end); #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK { phys_addr_t size; /* Free memblock.reserved array if it was allocated */ size = get_allocated_memblock_reserved_regions_info(&start); if (size) count += __free_memory_core(start, start + size); /* Free memblock.memory array if it was allocated */ size = get_allocated_memblock_memory_regions_info(&start); if (size) count += __free_memory_core(start, start + size); } #endif return count; }
static unsigned long __init free_low_memory_core_early(void) { unsigned long count = 0; phys_addr_t start, end; u64 i; /* IAMROOT-12AB: * ------------- * memblock 전체에서 MEMBLOCK_HOTPLUG 플래그를 제거한다. */ memblock_clear_hotplug(0, -1); for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL) count += __free_memory_core(start, end); /* IAMROOT-12AB: * ------------- * memblock을 관리하는 구조체들이 버디시스템으로 전환 후에 필요 없어지므로 * 사용했던 구조체들을 삭제한다. * (단 HOTPLUG 옵션이 사용되는 경우 memblock은 계속 필요하다) * */ #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK { phys_addr_t size; /* Free memblock.reserved array if it was allocated */ size = get_allocated_memblock_reserved_regions_info(&start); if (size) count += __free_memory_core(start, start + size); /* Free memblock.memory array if it was allocated */ size = get_allocated_memblock_memory_regions_info(&start); if (size) count += __free_memory_core(start, start + size); } #endif return count; }