[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