Now shrink_page_list expect all pages come from a same zone but it's too limited to use it. This patch removes the dependency and add may_discard in scan_control so next patch can use shrink_page_list with pages from multiple zonnes. Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx> --- mm/vmscan.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 6ba4e8ea..e36ee51 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -77,6 +77,9 @@ struct scan_control { /* Can pages be swapped as part of reclaim? */ int may_swap; + /* Discard pages in vrange */ + int may_discard; + int order; /* Scan (total_size >> priority) pages at once */ @@ -714,7 +717,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, goto keep; VM_BUG_ON(PageActive(page)); - VM_BUG_ON(page_zone(page) != zone); + if (zone) + VM_BUG_ON(page_zone(page) != zone); sc->nr_scanned++; @@ -785,6 +789,10 @@ static unsigned long shrink_page_list(struct list_head *page_list, ; /* try to reclaim the page below */ } + /* Fail to discard a page and returns a page to caller */ + if (sc->may_discard) + goto keep_locked; + /* * Anonymous process memory has backing store? * Try to allocate it some swap space here. @@ -963,7 +971,8 @@ keep: * back off and wait for congestion to clear because further reclaim * will encounter the same problem */ - if (nr_dirty && nr_dirty == nr_congested && global_reclaim(sc)) + if (nr_dirty && nr_dirty == nr_congested && global_reclaim(sc) && + zone) zone_set_flag(zone, ZONE_CONGESTED); free_hot_cold_page_list(&free_pages, 1); -- 1.8.1.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>