Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}