On Wed, Nov 29, 2023 at 09:01:26PM +0800, Zhiguo Jiang wrote:
It is needed to ensure sc->nr.unqueued_dirty > 0, which can avoid toHave you observed this happening, or is this from code review?
set PGDAT_DIRTY flag when sc->nr.unqueued_dirty and sc->nr.file_taken
are both zero at the same time.
It can be understood as two issues, and I will submit them separately.
It can't be guaranteed for the PGDAT_WRITEBACK flag that only pagesSo you're fixing two distinct things in the same patch?
marked for immediate reclaim are on evictable LRUs in other following
shrink processes of the same kswapd shrink recycling. So when both a
small amount of pages marked for immediate reclaim and a large amount
of pages marked for non-immediate reclaim are on evictable LRUs at the
same time, if it's only determined that there is at least a page marked
for immediate reclaim on evictable LRUs, kswapd shrink is throttled to
sleep, which will increase kswapd process consumption.
It can be fixed to throttle kswapd shrink when sc->nr.immediate is equal
to sc->nr.file_taken.
The added "massive" means that there are a large number of pages marked for immediate reclaim on evictable LRUs.
+++ b/mm/vmscan.cI don't understand why you've added the word "massive". Do you mean
@@ -5915,17 +5915,17 @@ static void shrink_node(pg_data_t *pgdat, struct scan_control *sc)
set_bit(PGDAT_WRITEBACK, &pgdat->flags);
/* Allow kswapd to start writing pages during reclaim.*/
- if (sc->nr.unqueued_dirty == sc->nr.file_taken)
+ if (sc->nr.unqueued_dirty && sc->nr.unqueued_dirty == sc->nr.file_taken)
set_bit(PGDAT_DIRTY, &pgdat->flags);
/*
- * If kswapd scans pages marked for immediate
+ * If kswapd scans massive pages marked for immediate
that the pages are large, or that kswapd has scanned a lot of pages?
* reclaim and under writeback (nr_immediate), it
* implies that pages are cycling through the LRU
* faster than they are written so forcibly stall
* until some pages complete writeback.
*/
- if (sc->nr.immediate)
+ if (sc->nr.immediate && sc->nr.immediate == sc->nr.file_taken)
reclaim_throttle(pgdat, VMSCAN_THROTTLE_WRITEBACK);
}