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

Commit 45fbe3ee authored by Linus Torvalds's avatar Linus Torvalds Committed by Ingo Molnar
Browse files

x86, e820, pci: reserve extra free space near end of RAM



The point is to take all RAM resources we have, and
_after_ we've added all the resources we've seen in
the E820 tree, we then _also_ try to add fake reserved
entries for any "round up to X" at the end of the RAM
resources.

[ Impact: improve PCI mem-resource allocation robustness, protect "stolen RAM" ]

Reported-by: default avatarYannick Roehlly <yannick.roehlly@free.fr>
Acked-by: default avatarJesse Barnes <jesse.barnes@intel.com>
Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: yannick.roehlly@free.fr
LKML-Reference: <4A01A784.2050407@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 134cbf35
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -1371,6 +1371,23 @@ void __init e820_reserve_resources(void)
	}
}

/* How much should we pad RAM ending depending on where it is? */
static unsigned long ram_alignment(resource_size_t pos)
{
	unsigned long mb = pos >> 20;

	/* To 64kB in the first megabyte */
	if (!mb)
		return 64*1024;

	/* To 1MB in the first 16MB */
	if (mb < 16)
		return 1024*1024;

	/* To 32MB for anything above that */
	return 32*1024*1024;
}

void __init e820_reserve_resources_late(void)
{
	int i;
@@ -1382,6 +1399,24 @@ void __init e820_reserve_resources_late(void)
			insert_resource_expand_to_fit(&iomem_resource, res);
		res++;
	}

	/*
	 * Try to bump up RAM regions to reasonable boundaries to
	 * avoid stolen RAM:
	 */
	for (i = 0; i < e820.nr_map; i++) {
		struct e820entry *entry = &e820_saved.map[i];
		resource_size_t start, end;

		if (entry->type != E820_RAM)
			continue;
		start = entry->addr + entry->size;
		end = round_up(start, ram_alignment(start));
		if (start == end)
			continue;
		reserve_region_with_split(&iomem_resource, start,
						  end - 1, "RAM buffer");
	}
}

char *__init default_machine_specific_memory_setup(void)