@@ -78,6 +78,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 */
@@ -715,7 +718,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++;
@@ -786,6 +790,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.
@@ -964,7 +972,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);