예제 #1
0
/** 
 * 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;
}