Loading mm/vmscan.c +16 −15 Original line number Diff line number Diff line Loading @@ -1898,6 +1898,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, if (nr_writeback && 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 (nr_unqueued_dirty == nr_taken) wakeup_flusher_threads(0, WB_REASON_VMSCAN); /* * Legacy memcg will stall in page writeback so avoid forcibly * stalling here. Loading @@ -1910,22 +1924,9 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, if (nr_dirty && nr_dirty == 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 (nr_unqueued_dirty == nr_taken) { wakeup_flusher_threads(0, WB_REASON_VMSCAN); /* Allow kswapd to start writing pages during reclaim. */ if (nr_unqueued_dirty == nr_taken) set_bit(PGDAT_DIRTY, &pgdat->flags); } /* * If kswapd scans pages marked marked for immediate Loading Loading
mm/vmscan.c +16 −15 Original line number Diff line number Diff line Loading @@ -1898,6 +1898,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, if (nr_writeback && 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 (nr_unqueued_dirty == nr_taken) wakeup_flusher_threads(0, WB_REASON_VMSCAN); /* * Legacy memcg will stall in page writeback so avoid forcibly * stalling here. Loading @@ -1910,22 +1924,9 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, if (nr_dirty && nr_dirty == 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 (nr_unqueued_dirty == nr_taken) { wakeup_flusher_threads(0, WB_REASON_VMSCAN); /* Allow kswapd to start writing pages during reclaim. */ if (nr_unqueued_dirty == nr_taken) set_bit(PGDAT_DIRTY, &pgdat->flags); } /* * If kswapd scans pages marked marked for immediate Loading