Skip to content

Commit 8b671fe

Browse files
Yu Zhaoakpm00
authored andcommitted
mm/mglru: fix div-by-zero in vmpressure_calc_level()
evict_folios() uses a second pass to reclaim folios that have gone through page writeback and become clean before it finishes the first pass, since folio_rotate_reclaimable() cannot handle those folios due to the isolation. The second pass tries to avoid potential double counting by deducting scan_control->nr_scanned. However, this can result in underflow of nr_scanned, under a condition where shrink_folio_list() does not increment nr_scanned, i.e., when folio_trylock() fails. The underflow can cause the divisor, i.e., scale=scanned+reclaimed in vmpressure_calc_level(), to become zero, resulting in the following crash: [exception RIP: vmpressure_work_fn+101] process_one_work at ffffffffa3313f2b Since scan_control->nr_scanned has no established semantics, the potential double counting has minimal risks. Therefore, fix the problem by not deducting scan_control->nr_scanned in evict_folios(). Link: https://lkml.kernel.org/r/[email protected] Fixes: 359a5e1 ("mm: multi-gen LRU: retry folios written back while isolated") Reported-by: Wei Xu <[email protected]> Signed-off-by: Yu Zhao <[email protected]> Cc: Alexander Motin <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 0b84780 commit 8b671fe

File tree

1 file changed

+0
-1
lines changed

1 file changed

+0
-1
lines changed

mm/vmscan.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4597,7 +4597,6 @@ static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, int swap
45974597

45984598
/* retry folios that may have missed folio_rotate_reclaimable() */
45994599
list_move(&folio->lru, &clean);
4600-
sc->nr_scanned -= folio_nr_pages(folio);
46014600
}
46024601

46034602
spin_lock_irq(&lruvec->lru_lock);

0 commit comments

Comments
 (0)