diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 85c472fbcbfa..52c4114a17f2 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3404,7 +3404,6 @@ static int __split_unmapped_folio(struct folio *folio, int new_order, const bool is_anon = folio_test_anon(folio); int order = folio_order(folio); int start_order = uniform_split ? new_order : order - 1; - struct folio *next; int split_order; /* @@ -3414,9 +3413,8 @@ static int __split_unmapped_folio(struct folio *folio, int new_order, for (split_order = start_order; split_order >= new_order; split_order--) { - struct folio *end_folio = folio_next(folio); int old_order = folio_order(folio); - struct folio *new_folio; + int nr_new_folios = 1UL << (old_order - split_order); /* order-1 anonymous folio is not supported */ if (is_anon && split_order == 1) @@ -3445,19 +3443,11 @@ static int __split_unmapped_folio(struct folio *folio, int new_order, pgalloc_tag_split(folio, old_order, split_order); __split_folio_to_order(folio, old_order, split_order); - if (is_anon) + if (is_anon) { mod_mthp_stat(old_order, MTHP_STAT_NR_ANON, -1); - /* - * Iterate through after-split folios and update folio stats. - */ - for (new_folio = folio; new_folio != end_folio; new_folio = next) { - next = folio_next(new_folio); - if (new_folio == page_folio(split_at)) - folio = new_folio; - if (is_anon) - mod_mthp_stat(folio_order(new_folio), - MTHP_STAT_NR_ANON, 1); + mod_mthp_stat(split_order, MTHP_STAT_NR_ANON, nr_new_folios); } + folio = page_folio(split_at); } return 0;