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; }
unsigned long __init free_low_memory_core_early(int nodeid) { unsigned long count = 0; //phys_addr_t start, end; phys_addr_t start, end, size; u64 i; ///* free reserved array temporarily so that it's treated as free area */ //memblock_free_reserved_regions(); for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) count += __free_memory_core(start, end); //for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) { // unsigned long start_pfn = PFN_UP(start); // unsigned long end_pfn = min_t(unsigned long, // PFN_DOWN(end), max_low_pfn); // if (start_pfn < end_pfn) { // __free_pages_memory(start_pfn, end_pfn); // count += end_pfn - start_pfn; // } //} /* free range that is used for reserved array if we allocate it */ size = get_allocated_memblock_reserved_regions_info(&start); if (size) count += __free_memory_core(start, start + size); ///* put region array back? */ //memblock_reserve_reserved_regions(); return count; }
unsigned long __init free_low_memory_core_early(int nodeid) { unsigned long count = 0; phys_addr_t start, end, size; u64 i; for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) count += __free_memory_core(start, end); /* free range that is used for reserved array if we allocate it */ size = get_allocated_memblock_reserved_regions_info(&start); if (size) count += __free_memory_core(start, start + size); 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; }
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); /* * We need to use NUMA_NO_NODE instead of NODE_DATA(0)->node_id * because in some case like Node0 doesn't have RAM installed * low ram will be on Node1 */ for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end, NULL) count += __free_memory_core(start, end); return count; }