Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb06bc8e authored by Tang Chen's avatar Tang Chen Committed by Linus Torvalds
Browse files

page_alloc: bootmem limit with movablecore_map



Ensure the bootmem will not allocate memory from areas that may be
ZONE_MOVABLE.  The map info is from movablecore_map boot option.

Signed-off-by: default avatarTang Chen <tangchen@cn.fujitsu.com>
Reviewed-by: default avatarWen Congyang <wency@cn.fujitsu.com>
Reviewed-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
Tested-by: default avatarLin Feng <linfeng@cn.fujitsu.com>
Cc: Wu Jianguo <wujianguo@huawei.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 42f47e27
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ struct memblock {


extern struct memblock memblock;
extern struct memblock memblock;
extern int memblock_debug;
extern int memblock_debug;
extern struct movablemem_map movablemem_map;


#define memblock_dbg(fmt, ...) \
#define memblock_dbg(fmt, ...) \
	if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
	if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
+17 −1
Original line number Original line Diff line number Diff line
@@ -101,6 +101,7 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start,
{
{
	phys_addr_t this_start, this_end, cand;
	phys_addr_t this_start, this_end, cand;
	u64 i;
	u64 i;
	int curr = movablemem_map.nr_map - 1;


	/* pump up @end */
	/* pump up @end */
	if (end == MEMBLOCK_ALLOC_ACCESSIBLE)
	if (end == MEMBLOCK_ALLOC_ACCESSIBLE)
@@ -114,13 +115,28 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start,
		this_start = clamp(this_start, start, end);
		this_start = clamp(this_start, start, end);
		this_end = clamp(this_end, start, end);
		this_end = clamp(this_end, start, end);


		if (this_end < size)
restart:
		if (this_end <= this_start || this_end < size)
			continue;
			continue;


		for (; curr >= 0; curr--) {
			if ((movablemem_map.map[curr].start_pfn << PAGE_SHIFT)
			    < this_end)
				break;
		}

		cand = round_down(this_end - size, align);
		cand = round_down(this_end - size, align);
		if (curr >= 0 &&
		    cand < movablemem_map.map[curr].end_pfn << PAGE_SHIFT) {
			this_end = movablemem_map.map[curr].start_pfn
				   << PAGE_SHIFT;
			goto restart;
		}

		if (cand >= this_start)
		if (cand >= this_start)
			return cand;
			return cand;
	}
	}

	return 0;
	return 0;
}
}