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

Commit 5b505b90 authored by Dave Hansen's avatar Dave Hansen Committed by Linus Torvalds
Browse files

[PATCH] sparsemem base: teach discontig about sparse ranges



discontig.c has some assumptions that mem_map[]s inside of a node are
contiguous.  Teach it to make sure that each region that it's bringing online
is actually made up of valid ranges of ram.

Written-by: default avatarAndy Whitcroft <apw@shadowen.org>
Signed-off-by: default avatarDave Hansen <haveblue@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 348f8b6c
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ static unsigned long calculate_numa_remap_pages(void)
{
	int nid;
	unsigned long size, reserve_pages = 0;
	unsigned long pfn;

	for_each_online_node(nid) {
		/*
@@ -234,6 +235,19 @@ static unsigned long calculate_numa_remap_pages(void)
		size = (size + LARGE_PAGE_BYTES - 1) / LARGE_PAGE_BYTES;
		/* now the roundup is correct, convert to PAGE_SIZE pages */
		size = size * PTRS_PER_PTE;

		/*
		 * Validate the region we are allocating only contains valid
		 * pages.
		 */
		for (pfn = node_end_pfn[nid] - size;
		     pfn < node_end_pfn[nid]; pfn++)
			if (!page_is_ram(pfn))
				break;

		if (pfn != node_end_pfn[nid])
			size = 0;

		printk("Reserving %ld pages of KVA for lmem_map of node %d\n",
				size, nid);
		node_remap_size[nid] = size;
+1 −1
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ static inline int page_kills_ppro(unsigned long pagenr)

extern int is_available_memory(efi_memory_desc_t *);

static inline int page_is_ram(unsigned long pagenr)
int page_is_ram(unsigned long pagenr)
{
	int i;
	unsigned long addr, end;
+2 −0
Original line number Diff line number Diff line
@@ -120,6 +120,8 @@ static __inline__ int get_order(unsigned long size)

extern int sysctl_legacy_va_layout;

extern int page_is_ram(unsigned long pagenr);

#endif /* __ASSEMBLY__ */

#ifdef __ASSEMBLY__