]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.4.17/x86-mm-trim-memory-in-memblock-to-be-page-aligned.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.4.17 / x86-mm-trim-memory-in-memblock-to-be-page-aligned.patch
CommitLineData
8c71e98e
GKH
1From 6ede1fd3cb404c0016de6ac529df46d561bd558b Mon Sep 17 00:00:00 2001
2From: Yinghai Lu <yinghai@kernel.org>
3Date: Mon, 22 Oct 2012 16:35:18 -0700
4Subject: x86, mm: Trim memory in memblock to be page aligned
5
6From: Yinghai Lu <yinghai@kernel.org>
7
8commit 6ede1fd3cb404c0016de6ac529df46d561bd558b upstream.
9
10We will not map partial pages, so need to make sure memblock
11allocation will not allocate those bytes out.
12
13Also we will use for_each_mem_pfn_range() to loop to map memory
14range to keep them consistent.
15
16Signed-off-by: Yinghai Lu <yinghai@kernel.org>
17Link: http://lkml.kernel.org/r/CAE9FiQVZirvaBMFYRfXMmWEcHbKSicQEHz4VAwUv0xFCk51ZNw@mail.gmail.com
18Acked-by: Jacob Shin <jacob.shin@amd.com>
19Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
20Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
21
22---
23 arch/x86/kernel/e820.c | 3 +++
24 include/linux/memblock.h | 1 +
25 mm/memblock.c | 24 ++++++++++++++++++++++++
26 3 files changed, 28 insertions(+)
27
28--- a/arch/x86/kernel/e820.c
29+++ b/arch/x86/kernel/e820.c
30@@ -1076,6 +1076,9 @@ void __init memblock_x86_fill(void)
31 memblock_add(ei->addr, ei->size);
32 }
33
34+ /* throw away partial pages */
35+ memblock_trim_memory(PAGE_SIZE);
36+
37 memblock_dump_all();
38 }
39
40--- a/include/linux/memblock.h
41+++ b/include/linux/memblock.h
42@@ -57,6 +57,7 @@ int memblock_add(phys_addr_t base, phys_
43 int memblock_remove(phys_addr_t base, phys_addr_t size);
44 int memblock_free(phys_addr_t base, phys_addr_t size);
45 int memblock_reserve(phys_addr_t base, phys_addr_t size);
46+void memblock_trim_memory(phys_addr_t align);
47
48 #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
49 void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
50--- a/mm/memblock.c
51+++ b/mm/memblock.c
52@@ -908,6 +908,30 @@ int __init_memblock memblock_is_region_r
53 return memblock_overlaps_region(&memblock.reserved, base, size) >= 0;
54 }
55
56+void __init_memblock memblock_trim_memory(phys_addr_t align)
57+{
58+ int i;
59+ phys_addr_t start, end, orig_start, orig_end;
60+ struct memblock_type *mem = &memblock.memory;
61+
62+ for (i = 0; i < mem->cnt; i++) {
63+ orig_start = mem->regions[i].base;
64+ orig_end = mem->regions[i].base + mem->regions[i].size;
65+ start = round_up(orig_start, align);
66+ end = round_down(orig_end, align);
67+
68+ if (start == orig_start && end == orig_end)
69+ continue;
70+
71+ if (start < end) {
72+ mem->regions[i].base = start;
73+ mem->regions[i].size = end - start;
74+ } else {
75+ memblock_remove_region(mem, i);
76+ i--;
77+ }
78+ }
79+}
80
81 void __init_memblock memblock_set_current_limit(phys_addr_t limit)
82 {