[patch 046/162] mm: use phys_addr_t for reserve_bootmem_region() arguments

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Stefan Bader <stefan.bader@xxxxxxxxxxxxx>
Subject: mm: use phys_addr_t for reserve_bootmem_region() arguments

Since 92923ca3aacef63 ("mm: meminit: only set page reserved in the
memblock region") the reserved bit is set on reserved memblock regions. 
However start and end address are passed as unsigned long.  This is only
32bit on i386, so it can end up marking the wrong pages reserved for
ranges at 4GB and above.

This was observed on a 32bit Xen dom0 which was booted with initial memory
set to a value below 4G but allowing to balloon in memory (dom0_mem=1024M
for example).  This would define a reserved bootmem region for the
additional memory (for example on a 8GB system there was a reverved region
covering the 4GB-8GB range).  But since the addresses were passed on as
unsigned long, this was actually marking all pages from 0 to 4GB as
reserved.

Fixes: 92923ca3aacef63 ("mm: meminit: only set page reserved in the memblock region")
Link: http://lkml.kernel.org/r/1463491221-10573-1-git-send-email-stefan.bader@xxxxxxxxxxxxx
Signed-off-by: Stefan Bader <stefan.bader@xxxxxxxxxxxxx>
Cc: <stable@xxxxxxxxxxxxxxx>	[4.2+]
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 include/linux/mm.h |    2 +-
 mm/page_alloc.c    |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff -puN include/linux/mm.h~mm-use-phys_addr_t-for-reserve_bootmem_region-arguments include/linux/mm.h
--- a/include/linux/mm.h~mm-use-phys_addr_t-for-reserve_bootmem_region-arguments
+++ a/include/linux/mm.h
@@ -1763,7 +1763,7 @@ extern void free_highmem_page(struct pag
 extern void adjust_managed_page_count(struct page *page, long count);
 extern void mem_init_print_info(const char *str);
 
-extern void reserve_bootmem_region(unsigned long start, unsigned long end);
+extern void reserve_bootmem_region(phys_addr_t start, phys_addr_t end);
 
 /* Free the reserved page into the buddy system, so it gets managed. */
 static inline void __free_reserved_page(struct page *page)
diff -puN mm/page_alloc.c~mm-use-phys_addr_t-for-reserve_bootmem_region-arguments mm/page_alloc.c
--- a/mm/page_alloc.c~mm-use-phys_addr_t-for-reserve_bootmem_region-arguments
+++ a/mm/page_alloc.c
@@ -1205,7 +1205,7 @@ static inline void init_reserved_page(un
  * marks the pages PageReserved. The remaining valid pages are later
  * sent to the buddy page allocator.
  */
-void __meminit reserve_bootmem_region(unsigned long start, unsigned long end)
+void __meminit reserve_bootmem_region(phys_addr_t start, phys_addr_t end)
 {
 	unsigned long start_pfn = PFN_DOWN(start);
 	unsigned long end_pfn = PFN_UP(end);
_
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]