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>
This commit is contained in:
committed by
H. Peter Anvin
parent
8e4029ee35
commit
c7fc2de0c8
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user