|
@@ -1056,6 +1056,15 @@ static unsigned long shrink_page_list(struct list_head *page_list,
|
|
|
* throttling so we could easily OOM just because too many
|
|
|
* pages are in writeback and there is nothing else to
|
|
|
* reclaim. Wait for the writeback to complete.
|
|
|
+ *
|
|
|
+ * In cases 1) and 2) we activate the pages to get them out of
|
|
|
+ * the way while we continue scanning for clean pages on the
|
|
|
+ * inactive list and refilling from the active list. The
|
|
|
+ * observation here is that waiting for disk writes is more
|
|
|
+ * expensive than potentially causing reloads down the line.
|
|
|
+ * Since they're marked for immediate reclaim, they won't put
|
|
|
+ * memory pressure on the cache working set any longer than it
|
|
|
+ * takes to write them to disk.
|
|
|
*/
|
|
|
if (PageWriteback(page)) {
|
|
|
/* Case 1 above */
|
|
@@ -1063,7 +1072,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
|
|
|
PageReclaim(page) &&
|
|
|
test_bit(PGDAT_WRITEBACK, &pgdat->flags)) {
|
|
|
nr_immediate++;
|
|
|
- goto keep_locked;
|
|
|
+ goto activate_locked;
|
|
|
|
|
|
/* Case 2 above */
|
|
|
} else if (sane_reclaim(sc) ||
|
|
@@ -1081,7 +1090,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
|
|
|
*/
|
|
|
SetPageReclaim(page);
|
|
|
nr_writeback++;
|
|
|
- goto keep_locked;
|
|
|
+ goto activate_locked;
|
|
|
|
|
|
/* Case 3 above */
|
|
|
} else {
|
|
@@ -1174,7 +1183,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
|
|
|
inc_node_page_state(page, NR_VMSCAN_IMMEDIATE);
|
|
|
SetPageReclaim(page);
|
|
|
|
|
|
- goto keep_locked;
|
|
|
+ goto activate_locked;
|
|
|
}
|
|
|
|
|
|
if (references == PAGEREF_RECLAIM_CLEAN)
|