|
@@ -1779,6 +1779,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
|
|
|
if (stat.nr_writeback && stat.nr_writeback == nr_taken)
|
|
|
set_bit(PGDAT_WRITEBACK, &pgdat->flags);
|
|
|
|
|
|
+ /*
|
|
|
+ * If dirty pages are scanned that are not queued for IO, it
|
|
|
+ * 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.
|
|
|
+ */
|
|
|
+ if (stat.nr_unqueued_dirty == nr_taken)
|
|
|
+ wakeup_flusher_threads(WB_REASON_VMSCAN);
|
|
|
+
|
|
|
/*
|
|
|
* Legacy memcg will stall in page writeback so avoid forcibly
|
|
|
* stalling here.
|
|
@@ -1791,22 +1805,9 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
|
|
|
if (stat.nr_dirty && stat.nr_dirty == stat.nr_congested)
|
|
|
set_bit(PGDAT_CONGESTED, &pgdat->flags);
|
|
|
|
|
|
- /*
|
|
|
- * If dirty pages are scanned that are not queued for IO, it
|
|
|
- * 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) {
|
|
|
- wakeup_flusher_threads(WB_REASON_VMSCAN);
|
|
|
+ /* Allow kswapd to start writing pages during reclaim. */
|
|
|
+ if (stat.nr_unqueued_dirty == nr_taken)
|
|
|
set_bit(PGDAT_DIRTY, &pgdat->flags);
|
|
|
- }
|
|
|
|
|
|
/*
|
|
|
* If kswapd scans pages marked marked for immediate
|