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;
folio_clear_has_hwpoisoned(folio);
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 new_folios = 1UL << (old_order - split_order);
/* order-1 anonymous folio is not supported */
if (is_anon && split_order == 1)
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, new_folios);
}
+ folio = page_folio(split_at);
}
return 0;