summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2010-10-12 14:07:09 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2010-10-12 15:37:51 -0700
commitc7fc2de0c83dbd2eaf759c5cd0e2b9cf1eb4df3a (patch)
treec4413e9b3bc164394c2daccf34e18e0b1d6c8811 /arch
parent8e4029ee3517084ae00fbfbcb51cc365d8857061 (diff)
downloadlinux-3.10-c7fc2de0c83dbd2eaf759c5cd0e2b9cf1eb4df3a.tar.gz
linux-3.10-c7fc2de0c83dbd2eaf759c5cd0e2b9cf1eb4df3a.tar.bz2
linux-3.10-c7fc2de0c83dbd2eaf759c5cd0e2b9cf1eb4df3a.zip
memblock, bootmem: Round pfn properly for memory and reserved regions
We need to round memory regions correctly -- specifically, we need to round reserved region in the more expansive direction (lower limit down, upper limit up) whereas usable memory regions need to be rounded in the more restrictive direction (lower limit up, upper limit down). This introduces two set of inlines: memblock_region_memory_base_pfn() memblock_region_memory_end_pfn() memblock_region_reserved_base_pfn() memblock_region_reserved_end_pfn() Although they are antisymmetric (and therefore are technically duplicates) the use of the different inlines explicitly documents the programmer's intention. The lack of proper rounding caused a bug on ARM, which was then found to also affect other architectures. Reported-by: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Yinghai Lu <yinghai@kernel.org> LKML-Reference: <4CB4CDFD.4020105@kernel.org> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mm/init.c8
-rw-r--r--arch/powerpc/mm/mem.c14
-rw-r--r--arch/powerpc/mm/numa.c4
-rw-r--r--arch/sh/mm/init.c4
-rw-r--r--arch/sparc/mm/init_64.c4
5 files changed, 17 insertions, 17 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index d6022d1f51d..63f441797c9 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -182,8 +182,8 @@ static void __init arm_bootmem_init(struct meminfo *mi,
* Reserve the memblock reserved regions in bootmem.
*/
for_each_memblock(reserved, reg) {
- phys_addr_t start = memblock_region_base_pfn(reg);
- phys_addr_t end = memblock_region_end_pfn(reg);
+ phys_addr_t start = memblock_region_reserved_base_pfn(reg);
+ phys_addr_t end = memblock_region_reserved_end_pfn(reg);
if (start >= start_pfn && end <= end_pfn)
reserve_bootmem_node(pgdat, __pfn_to_phys(start),
(end - start) << PAGE_SHIFT,
@@ -251,8 +251,8 @@ static void arm_memory_present(void)
struct memblock_region *reg;
for_each_memblock(memory, reg)
- memory_present(0, memblock_region_base_pfn(reg),
- memblock_region_end_pfn(reg));
+ memory_present(0, memblock_region_memory_base_pfn(reg),
+ memblock_region_memory_end_pfn(reg));
}
#endif
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index f661f6c527d..a6649965090 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -148,8 +148,8 @@ walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
int ret = -1;
for_each_memblock(memory, reg) {
- tstart = max(start_pfn, memblock_region_base_pfn(reg));
- tend = min(end_pfn, memblock_region_end_pfn(reg));
+ tstart = max(start_pfn, memblock_region_memory_base_pfn(reg));
+ tend = min(end_pfn, memblock_region_memory_end_pfn(reg));
if (tstart >= tend)
continue;
ret = (*func)(tstart, tend - tstart, arg);
@@ -195,8 +195,8 @@ void __init do_init_bootmem(void)
/* Add active regions with valid PFNs */
for_each_memblock(memory, reg) {
unsigned long start_pfn, end_pfn;
- start_pfn = memblock_region_base_pfn(reg);
- end_pfn = memblock_region_end_pfn(reg);
+ start_pfn = memblock_region_memory_base_pfn(reg);
+ end_pfn = memblock_region_memory_end_pfn(reg);
add_active_range(0, start_pfn, end_pfn);
}
@@ -236,9 +236,9 @@ static int __init mark_nonram_nosave(void)
for_each_memblock(memory, reg) {
if (prev &&
- memblock_region_end_pfn(prev) < memblock_region_base_pfn(reg))
- register_nosave_region(memblock_region_end_pfn(prev),
- memblock_region_base_pfn(reg));
+ memblock_region_memory_end_pfn(prev) < memblock_region_memory_base_pfn(reg))
+ register_nosave_region(memblock_region_memory_end_pfn(prev),
+ memblock_region_memory_base_pfn(reg));
prev = reg;
}
return 0;
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 066fb443ba5..74505b24537 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -811,8 +811,8 @@ static void __init setup_nonnuma(void)
(top_of_ram - total_ram) >> 20);
for_each_memblock(memory, reg) {
- start_pfn = memblock_region_base_pfn(reg);
- end_pfn = memblock_region_end_pfn(reg);
+ start_pfn = memblock_region_memory_base_pfn(reg);
+ end_pfn = memblock_region_memory_end_pfn(reg);
fake_numa_create_new_node(end_pfn, &nid);
add_active_range(nid, start_pfn, end_pfn);
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c
index b977475f744..552bea5113f 100644
--- a/arch/sh/mm/init.c
+++ b/arch/sh/mm/init.c
@@ -244,8 +244,8 @@ static void __init do_init_bootmem(void)
/* Add active regions with valid PFNs. */
for_each_memblock(memory, reg) {
unsigned long start_pfn, end_pfn;
- start_pfn = memblock_region_base_pfn(reg);
- end_pfn = memblock_region_end_pfn(reg);
+ start_pfn = memblock_region_memory_base_pfn(reg);
+ end_pfn = memblock_region_memory_end_pfn(reg);
__add_active_range(0, start_pfn, end_pfn);
}
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index dc584d26d59..4c2572773b5 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -1294,8 +1294,8 @@ static void __init bootmem_init_nonnuma(void)
if (!reg->size)
continue;
- start_pfn = memblock_region_base_pfn(reg);
- end_pfn = memblock_region_end_pfn(reg);
+ start_pfn = memblock_region_memory_base_pfn(reg);
+ end_pfn = memblock_region_memory_end_pfn(reg);
add_active_range(0, start_pfn, end_pfn);
}