[RFC][PATCH] mm: the page of MIGRATE_RESERVE don't insert into pcp

From: KOSAKI Motohiro
Date: Wed Nov 05 2008 - 19:17:19 EST


MIGRATE_RESERVE mean that the page is for emergency.
So it shouldn't be cached in pcp.

otherwise, the system have unnecessary memory starvation risk
because other cpu can't use this emergency pages.



Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx>
CC: Mel Gorman <mel@xxxxxxxxx>
CC: Christoph Lameter <cl@xxxxxxxxxxxxxxxxxxxx>

---
mm/page_alloc.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

Index: b/mm/page_alloc.c
===================================================================
--- a/mm/page_alloc.c 2008-11-06 06:01:15.000000000 +0900
+++ b/mm/page_alloc.c 2008-11-06 06:27:41.000000000 +0900
@@ -1002,6 +1002,7 @@ static void free_hot_cold_page(struct pa
struct zone *zone = page_zone(page);
struct per_cpu_pages *pcp;
unsigned long flags;
+ int migratetype = get_pageblock_migratetype(page);

if (PageAnon(page))
page->mapping = NULL;
@@ -1018,16 +1019,25 @@ static void free_hot_cold_page(struct pa
pcp = &zone_pcp(zone, get_cpu())->pcp;
local_irq_save(flags);
__count_vm_event(PGFREE);
+
+ set_page_private(page, migratetype);
+
+ /* the page for emergency shouldn't be cached */
+ if (migratetype == MIGRATE_RESERVE) {
+ free_one_page(zone, page, 0);
+ goto out;
+ }
if (cold)
list_add_tail(&page->lru, &pcp->list);
else
list_add(&page->lru, &pcp->list);
- set_page_private(page, get_pageblock_migratetype(page));
pcp->count++;
if (pcp->count >= pcp->high) {
free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
pcp->count -= pcp->batch;
}
+
+out:
local_irq_restore(flags);
put_cpu();
}


--
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/