From 63956d68a9858ec226fc9b25da400ed2d3f52fc6 Mon Sep 17 00:00:00 2001 From: Konstantin Khlebnikov Date: Tue, 10 Jan 2012 15:07:04 -0800 Subject: [PATCH] --- yaml --- r: 282991 b: refs/heads/master c: cc59850ef940e4ee6a765d28b439b9bafe07cf63 h: refs/heads/master i: 282989: f7163abd8114e1322fedfebed910d2c44d23a531 282987: 94e76315df8fe3692fe6a879947a1dff215f5d93 282983: 76b2d87cd4e4d591311c27c8cc098628021211f0 282975: a84406560399384732594b1ed43b2912053cfaef v: v3 --- [refs] | 2 +- trunk/include/linux/gfp.h | 1 + trunk/mm/page_alloc.c | 13 +++++++++++++ trunk/mm/swap.c | 14 +++----------- trunk/mm/vmscan.c | 20 +------------------- 5 files changed, 19 insertions(+), 31 deletions(-) diff --git a/[refs] b/[refs] index 0c5c4caff454..6661a56a665d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c909e99364c8b6ca07864d752950b6b4ecf6bef4 +refs/heads/master: cc59850ef940e4ee6a765d28b439b9bafe07cf63 diff --git a/trunk/include/linux/gfp.h b/trunk/include/linux/gfp.h index 3a76faf6a3ee..656295865d58 100644 --- a/trunk/include/linux/gfp.h +++ b/trunk/include/linux/gfp.h @@ -358,6 +358,7 @@ void *alloc_pages_exact_nid(int nid, size_t size, gfp_t gfp_mask); extern void __free_pages(struct page *page, unsigned int order); extern void free_pages(unsigned long addr, unsigned int order); extern void free_hot_cold_page(struct page *page, int cold); +extern void free_hot_cold_page_list(struct list_head *list, int cold); #define __free_page(page) __free_pages((page), 0) #define free_page(addr) free_pages((addr), 0) diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 7990ca154d1b..cd0c95c6cc9e 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -1188,6 +1188,19 @@ void free_hot_cold_page(struct page *page, int cold) local_irq_restore(flags); } +/* + * Free a list of 0-order pages + */ +void free_hot_cold_page_list(struct list_head *list, int cold) +{ + struct page *page, *next; + + list_for_each_entry_safe(page, next, list, lru) { + trace_mm_pagevec_free(page, cold); + free_hot_cold_page(page, cold); + } +} + /* * split_page takes a non-compound higher-order page, and splits it into * n (1<lru_lock, flags); - zone = NULL; - } - __pagevec_free(&pages_to_free); - pagevec_reinit(&pages_to_free); - } + list_add(&page->lru, &pages_to_free); } if (zone) spin_unlock_irqrestore(&zone->lru_lock, flags); - pagevec_free(&pages_to_free); + free_hot_cold_page_list(&pages_to_free, cold); } EXPORT_SYMBOL(release_pages); diff --git a/trunk/mm/vmscan.c b/trunk/mm/vmscan.c index 753a2dc300b9..3d571df41c79 100644 --- a/trunk/mm/vmscan.c +++ b/trunk/mm/vmscan.c @@ -734,24 +734,6 @@ static enum page_references page_check_references(struct page *page, return PAGEREF_RECLAIM; } -static noinline_for_stack void free_page_list(struct list_head *free_pages) -{ - struct pagevec freed_pvec; - struct page *page, *tmp; - - pagevec_init(&freed_pvec, 1); - - list_for_each_entry_safe(page, tmp, free_pages, lru) { - list_del(&page->lru); - if (!pagevec_add(&freed_pvec, page)) { - __pagevec_free(&freed_pvec); - pagevec_reinit(&freed_pvec); - } - } - - pagevec_free(&freed_pvec); -} - /* * shrink_page_list() returns the number of reclaimed pages */ @@ -1015,7 +997,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, if (nr_dirty && nr_dirty == nr_congested && scanning_global_lru(sc)) zone_set_flag(zone, ZONE_CONGESTED); - free_page_list(&free_pages); + free_hot_cold_page_list(&free_pages, 1); list_splice(&ret_pages, page_list); count_vm_events(PGACTIVATE, pgactivate);