diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index d9a8a4affaaf..7d24d065aed8 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -182,6 +182,16 @@ static inline bool lru_gen_is_active(struct lruvec *lruvec, int gen) return gen == lru_gen_from_seq(max_seq) || gen == lru_gen_from_seq(max_seq - 1); } +static inline bool lru_gen_should_rotate(struct folio *folio) +{ + int gen = folio_lru_gen(folio); + int type = folio_is_file_lru(folio); + struct lruvec *lruvec = folio_lruvec(folio); + struct lru_gen_folio *lrugen = &lruvec->lrugen; + + return gen != lru_gen_from_seq(READ_ONCE(lrugen->min_seq[type])); +} + static inline void lru_gen_update_size(struct lruvec *lruvec, struct folio *folio, int old_gen, int new_gen) { diff --git a/mm/swap.c b/mm/swap.c index 802681b3c857..e3dd092224ba 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -692,7 +692,7 @@ void deactivate_file_folio(struct folio *folio) struct folio_batch *fbatch; /* Deactivating an unevictable folio will not accelerate reclaim */ - if (folio_test_unevictable(folio)) + if (folio_test_unevictable(folio) || !lru_gen_should_rotate(folio)) return; folio_get(folio);