mirror of
https://github.com/torvalds/linux.git
synced 2026-11-09 13:44:03 +01:00
mm/migrate: copy all referenced state via folio_migrate_lru_refs
folio_migrate_flags() copies PG_referenced separately from the MGLRU refs counter, which folio_migrate_refs() transfers. Yet under MGLRU, PG_referenced and the refs counter bits together describe the referenced status of a folio. Consolidate the two: rename folio_migrate_refs() to folio_migrate_lru_refs() and let it copy the complete referenced status, i.e., the MGLRU refs count including PG_referenced, or just PG_referenced for the active/inactive LRU. Drop the open-coded PG_referenced copy so the referenced status is transferred in one place. No behavior change is intended: under the active/inactive LRU the extra bits are unused, so operating on them is a noop. Transfer the reference state first, before the destination folio is marked up to date, as a best effort to retain referenced status. Link: https://lore.kernel.org/20260906-mglru-flags-cleanup-v6-3-9aacbd77d4ca@tencent.com Signed-off-by: Kairui Song <kasong@tencent.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Baoquan He <baoquan.he@linux.dev> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Lian Wang <lianux.mm@gmail.com> Reviewed-by: Barry Song <baohua@kernel.org> Reviewed-by: Ridong Chen <ridong.chen@linux.dev> Cc: Axel Rasmussen <axelrasmussen@google.com> Cc: Chris Li <chrisl@kernel.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Kairui Song <ryncsn@gmail.com> Cc: Liam R. Howlett <liam@infradead.org> Cc: Lorenzo Stoakes <ljs@kernel.org> Cc: Michal Hocko <mhocko@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Qi Zheng <qi.zheng@linux.dev> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Wei Xu <weixugc@google.com> Cc: Yuanchu Xie <yuanchu@google.com> Cc: Yu Zhao <yuzhao@google.com> Cc: Zi Yan <ziy@nvidia.com>
This commit is contained in:
parent
64169ceea5
commit
d982ba0b97
|
|
@ -373,11 +373,19 @@ static inline bool lru_gen_del_folio(struct lruvec *lruvec, struct folio *folio,
|
|||
return true;
|
||||
}
|
||||
|
||||
static inline void folio_migrate_refs(struct folio *new, const struct folio *old)
|
||||
/**
|
||||
* folio_migrate_lru_refs - copy the reference state to a new folio
|
||||
* @new: the destination folio
|
||||
* @old: the source folio
|
||||
*
|
||||
* Transfer the reference state to @new during migration: the MGLRU
|
||||
* refs count, including PG_referenced, or just PG_referenced for the
|
||||
* active/inactive LRU.
|
||||
*/
|
||||
static inline void folio_migrate_lru_refs(struct folio *new, const struct folio *old)
|
||||
{
|
||||
unsigned long refs = READ_ONCE(old->flags.f) & LRU_REFS_MASK;
|
||||
|
||||
set_mask_bits(&new->flags.f, LRU_REFS_MASK, refs);
|
||||
BUILD_BUG_ON(LRU_REFS_MASK & BIT(PG_referenced));
|
||||
folio_set_lru_refs(new, folio_lru_refs(old));
|
||||
}
|
||||
#else /* !CONFIG_LRU_GEN */
|
||||
|
||||
|
|
@ -406,8 +414,10 @@ static inline bool lru_gen_del_folio(struct lruvec *lruvec, struct folio *folio,
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline void folio_migrate_refs(struct folio *new, const struct folio *old)
|
||||
static inline void folio_migrate_lru_refs(struct folio *new, const struct folio *old)
|
||||
{
|
||||
if (folio_test_referenced(old))
|
||||
folio_set_referenced(new);
|
||||
}
|
||||
#endif /* CONFIG_LRU_GEN */
|
||||
|
||||
|
|
|
|||
|
|
@ -776,8 +776,9 @@ void folio_migrate_flags(struct folio *newfolio, struct folio *folio)
|
|||
{
|
||||
int cpupid;
|
||||
|
||||
if (folio_test_referenced(folio))
|
||||
folio_set_referenced(newfolio);
|
||||
/* Copy the reference state, including PG_referenced */
|
||||
folio_migrate_lru_refs(newfolio, folio);
|
||||
|
||||
if (folio_test_uptodate(folio))
|
||||
folio_mark_uptodate(newfolio);
|
||||
if (folio_test_clear_active(folio)) {
|
||||
|
|
@ -807,7 +808,6 @@ void folio_migrate_flags(struct folio *newfolio, struct folio *folio)
|
|||
if (folio_test_idle(folio))
|
||||
folio_set_idle(newfolio);
|
||||
|
||||
folio_migrate_refs(newfolio, folio);
|
||||
/*
|
||||
* Copy NUMA information to the new page, to prevent over-eager
|
||||
* future migrations of this same page.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user