aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 17:17:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 17:17:00 -0400
commitb738d764652dc5aab1c8939f637112981fce9e0e (patch)
treea7e98864dfe0c8076a24cba75febbbdb0a52e9dc
parentf8409abdc592e13cefbe4e4a24a84b3d5741e85f (diff)
Don't trigger congestion wait on dirty-but-not-writeout pages
shrink_inactive_list() used to wait 0.1s to avoid congestion when all the pages that were isolated from the inactive list were dirty but not under active writeback. That makes no real sense, and apparently causes major interactivity issues under some loads since 3.11. The ostensible reason for it was to wait for kswapd to start writing pages, but that seems questionable as well, since the congestion wait code seems to trigger for kswapd itself as well. Also, the logic behind delaying anything when we haven't actually started writeback is not clear - it only delays actually starting that writeback. We'll still trigger the congestion waiting if (a) the process is kswapd, and we hit pages flagged for immediate reclaim (b) the process is not kswapd, and the zone backing dev writeback is actually congested. This probably needs to be revisited, but as it is this fixes a reported regression. Reported-by: Felipe Contreras <felipe.contreras@gmail.com> Pinpointed-by: Hillf Danton <dhillf@gmail.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Mel Gorman <mgorman@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/vmscan.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 71f23c0c1090..e01ded365440 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1573,20 +1573,18 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
1573 * If dirty pages are scanned that are not queued for IO, it 1573 * If dirty pages are scanned that are not queued for IO, it
1574 * implies that flushers are not keeping up. In this case, flag 1574 * implies that flushers are not keeping up. In this case, flag
1575 * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing 1575 * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing
1576 * pages from reclaim context. It will forcibly stall in the 1576 * pages from reclaim context.
1577 * next check.
1578 */ 1577 */
1579 if (nr_unqueued_dirty == nr_taken) 1578 if (nr_unqueued_dirty == nr_taken)
1580 zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY); 1579 zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY);
1581 1580
1582 /* 1581 /*
1583 * In addition, if kswapd scans pages marked marked for 1582 * If kswapd scans pages marked marked for immediate
1584 * immediate reclaim and under writeback (nr_immediate), it 1583 * reclaim and under writeback (nr_immediate), it implies
1585 * implies that pages are cycling through the LRU faster than 1584 * that pages are cycling through the LRU faster than
1586 * they are written so also forcibly stall. 1585 * they are written so also forcibly stall.
1587 */ 1586 */
1588 if ((nr_unqueued_dirty == nr_taken || nr_immediate) && 1587 if (nr_immediate && current_may_throttle())
1589 current_may_throttle())
1590 congestion_wait(BLK_RW_ASYNC, HZ/10); 1588 congestion_wait(BLK_RW_ASYNC, HZ/10);
1591 } 1589 }
1592 1590