[Devel] [PATCH VZ10 4/8] mm/memcontrol: completely switch memcg_numa_isolate_pages() to folio
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Tue Sep 2 13:59:14 MSK 2025
Almost everything is in folios already, so let's switch and remove, now
excess, page variable completely.
https://virtuozzo.atlassian.net/browse/VSTOR-114298
Fixes: c92459bc18307 ("mm: memcontrol: add memory.numa_migrate file")
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
mm/memcontrol.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 2c707716d0557..6eb8202f5d4c0 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3513,7 +3513,6 @@ static long memcg_numa_isolate_pages(struct lruvec *lruvec, enum lru_list lru,
struct list_head *src = &lruvec->lists[lru];
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
unsigned long nr_zone_taken[MAX_NR_ZONES] = { 0 };
- struct page *page;
long scanned = 0, taken = 0;
struct folio *folio = NULL;
struct address_space *mapping;
@@ -3524,7 +3523,6 @@ static long memcg_numa_isolate_pages(struct lruvec *lruvec, enum lru_list lru,
while (!list_empty(src) && scanned < nr_to_scan && taken < nr_to_scan) {
int nr_pages;
struct list_head *move_to = src;
- page = list_last_entry(src, struct page, lru);
scanned++;
@@ -3540,8 +3538,10 @@ static long memcg_numa_isolate_pages(struct lruvec *lruvec, enum lru_list lru,
* isolate_migratepages_block(), mode variable is defined and
* set to ISOLATE_ASYNC_MIGRATE in order to keep the original
* code unchanged where possible.
+ *
+ * Also it is switched to folio, based on isolate_lru_folios().
*/
- folio = page_folio(page);
+ folio = lru_to_folio(src);
/*
* Migration will fail if an anonymous page is pinned in memory,
@@ -3613,25 +3613,25 @@ static long memcg_numa_isolate_pages(struct lruvec *lruvec, enum lru_list lru,
}
/*
- * Be careful not to clear PageLRU until after we're
- * sure the page is not being freed elsewhere -- the
- * page release code relies on it.
+ * Be careful not to clear the lru flag until after we're
+ * sure the folio is not being freed elsewhere -- the
+ * folio release code relies on it.
*/
- if (unlikely(!get_page_unless_zero(page)))
+ if (unlikely(!folio_try_get(folio)))
goto isolate_fail;
- if (!TestClearPageLRU(page)) {
+ if (!folio_test_clear_lru(folio)) {
/* Another thread is already isolating this page */
- put_page(page);
+ folio_put(folio);
goto isolate_fail;
}
- nr_pages = thp_nr_pages(page);
+ nr_pages = folio_nr_pages(folio);
taken += nr_pages;
- nr_zone_taken[page_zonenum(page)] += nr_pages;
+ nr_zone_taken[folio_zonenum(folio)] += nr_pages;
move_to = dst;
isolate_fail:
- list_move(&page->lru, move_to);
+ list_move(&folio->lru, move_to);
}
__mod_node_page_state(pgdat, NR_LRU_BASE + lru, -taken);
__mod_node_page_state(pgdat, NR_ISOLATED_ANON + is_file_lru(lru), taken);
--
2.50.1
More information about the Devel
mailing list