/** * memblock에 특정 크기만큼 할당 * * @return 할당한 가상주소 */ static void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, u64 goal, u64 limit) { void *ptr; /**< 가상주소 */ u64 addr; /**< 물리주소 */ /* limit는 현재 메모리의 한계 */ if (limit > memblock.current_limit) limit = memblock.current_limit; addr = find_memory_core_early(nid, size, align, goal, limit); if (addr == MEMBLOCK_ERROR) return NULL; ptr = phys_to_virt(addr); memset(ptr, 0, size); memblock_x86_reserve_range(addr, addr + size, "BOOTMEM"); /* * The min_count is set to 0 so that bootmem allocated blocks * are never reported as leaks. */ /* memory leak이 발생하는 경우를 리포팅. * * FIXME: min_count(3번째 인자)가 0이면, 리포팅을 하지 않고, * -1이면, 무시인데, 이 경우에 굳이 쓰이는지 알수 없음. */ kmemleak_alloc(ptr, size, 0, 0); return ptr; }
static void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, u64 goal, u64 limit) { void *ptr; u64 addr; if (limit > memblock.current_limit) limit = memblock.current_limit; addr = find_memory_core_early(nid, size, align, goal, limit); if (addr == MEMBLOCK_ERROR) return NULL; ptr = phys_to_virt(addr); memset(ptr, 0, size); memblock_x86_reserve_range(addr, addr + size, "BOOTMEM"); /* * The min_count is set to 0 so that bootmem allocated blocks * are never reported as leaks. */ kmemleak_alloc(ptr, size, 0, 0); return ptr; }