[RFC -v2-pre2 4/5] ZZZ Only SegPageReserved() on memblock reservedpages.

From: Robin Holt
Date: Thu Jul 25 2013 - 05:25:15 EST


---
include/linux/mm.h | 2 ++
mm/nobootmem.c | 3 +++
mm/page_alloc.c | 18 +++++++++++-------
3 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index e0c8528..b264a26 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1322,6 +1322,8 @@ static inline void adjust_managed_page_count(struct page *page, long count)
totalram_pages += count;
}

+extern void reserve_bootmem_region(unsigned long start, unsigned long end);
+
/* Free the reserved page into the buddy system, so it gets managed. */
static inline void __free_reserved_page(struct page *page)
{
diff --git a/mm/nobootmem.c b/mm/nobootmem.c
index 2159e68..0840af2 100644
--- a/mm/nobootmem.c
+++ b/mm/nobootmem.c
@@ -117,6 +117,9 @@ static unsigned long __init free_low_memory_core_early(void)
phys_addr_t start, end, size;
u64 i;

+ for_each_reserved_mem_region(i, &start, &end)
+ reserve_bootmem_region(start, end);
+
for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL)
count += __free_memory_core(start, end);

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 048e166..3aa30b7 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -698,7 +698,7 @@ static void free_one_page(struct zone *zone, struct page *page, int order,
}

static void __init_single_page(unsigned long pfn, unsigned long zone,
- int nid, int reserved)
+ int nid, int page_count)
{
struct page *page = pfn_to_page(pfn);
struct zone *z = &NODE_DATA(nid)->node_zones[zone];
@@ -708,12 +708,9 @@ static void __init_single_page(unsigned long pfn, unsigned long zone,
init_page_count(page);
page_mapcount_reset(page);
page_nid_reset_last(page);
- if (reserved) {
- SetPageReserved(page);
- } else {
- ClearPageReserved(page);
- set_page_count(page, 0);
- }
+ ClearPageReserved(page);
+ set_page_count(page, page_count);
+
/*
* Mark the block movable so that blocks are reserved for
* movable at startup. This will force kernel allocations
@@ -741,6 +738,13 @@ static void __init_single_page(unsigned long pfn, unsigned long zone,
#endif
}

+void reserve_bootmem_region(unsigned long start, unsigned long end)
+{
+ for (; start < end; start++)
+ if (pfn_valid(start))
+ SetPageReserved(pfn_to_page(start));
+}
+
static bool free_pages_prepare(struct page *page, unsigned int order)
{
int i;
--
1.8.2.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/