static unsigned long __init __free_memory_core(phys_addr_t start, phys_addr_t end) { 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) return 0; __free_pages_memory(start_pfn, end_pfn); return end_pfn - start_pfn; }
unsigned long __init free_all_memory_core_early(int nodeid) { int i; u64 start, end; unsigned long count = 0; struct range *range = NULL; int nr_range; nr_range = get_free_all_memory_range(&range, nodeid); for (i = 0; i < nr_range; i++) { start = range[i].start; end = range[i].end; count += end - start; __free_pages_memory(start, end); } return count; }
static unsigned long __init __free_memory_core(phys_addr_t start, phys_addr_t end) { unsigned long start_pfn = PFN_UP(start); /* IAMROOT-12AB: * ------------- * 지정된 end 영역이 lowmem을 초과하지 않도록 한다. */ unsigned long end_pfn = min_t(unsigned long, PFN_DOWN(end), max_low_pfn); if (start_pfn > end_pfn) return 0; __free_pages_memory(start_pfn, end_pfn); return end_pfn - start_pfn; }