|
@@ -1798,12 +1798,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
|
|
|
|
|
|
/*
|
|
|
* If dirty pages are scanned that are not queued for IO, it
|
|
|
- * implies that flushers are not keeping up. In this case, flag
|
|
|
- * the pgdat PGDAT_DIRTY and kswapd will start writing pages from
|
|
|
- * reclaim context.
|
|
|
+ * implies that flushers are not doing their job. This can
|
|
|
+ * happen when memory pressure pushes dirty pages to the end of
|
|
|
+ * the LRU before the dirty limits are breached and the dirty
|
|
|
+ * data has expired. It can also happen when the proportion of
|
|
|
+ * dirty pages grows not through writes but through memory
|
|
|
+ * pressure reclaiming all the clean cache. And in some cases,
|
|
|
+ * the flushers simply cannot keep up with the allocation
|
|
|
+ * rate. Nudge the flusher threads in case they are asleep, but
|
|
|
+ * also allow kswapd to start writing pages during reclaim.
|
|
|
*/
|
|
|
- if (stat.nr_unqueued_dirty == nr_taken)
|
|
|
+ if (stat.nr_unqueued_dirty == nr_taken) {
|
|
|
+ wakeup_flusher_threads(0, WB_REASON_VMSCAN);
|
|
|
set_bit(PGDAT_DIRTY, &pgdat->flags);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* If kswapd scans pages marked marked for immediate
|
|
@@ -2787,7 +2795,7 @@ retry:
|
|
|
writeback_threshold = sc->nr_to_reclaim + sc->nr_to_reclaim / 2;
|
|
|
if (total_scanned > writeback_threshold) {
|
|
|
wakeup_flusher_threads(laptop_mode ? 0 : total_scanned,
|
|
|
- WB_REASON_TRY_TO_FREE_PAGES);
|
|
|
+ WB_REASON_VMSCAN);
|
|
|
sc->may_writepage = 1;
|
|
|
}
|
|
|
} while (--sc->priority >= 0);
|