Merge tag 'mm-hotfixes-stable-2026-02-13-07-14' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Pull MM fixes from Andrew Morton:
 "Three MM hotfixes, all three are cc:stable"

* tag 'mm-hotfixes-stable-2026-02-13-07-14' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm:
  procfs: fix possible double mmput() in do_procmap_query()
  mm/page_alloc: skip debug_check_no_{obj,locks}_freed with FPI_TRYLOCK
  mm/hugetlb: restore failed global reservations to subpool
This commit is contained in:
Linus Torvalds
2026-02-13 12:13:27 -08:00
3 changed files with 22 additions and 7 deletions

View File

@@ -6723,6 +6723,15 @@ out_put_pages:
*/
hugetlb_acct_memory(h, -gbl_resv);
}
/* Restore used_hpages for pages that failed global reservation */
if (gbl_reserve && spool) {
unsigned long flags;
spin_lock_irqsave(&spool->lock, flags);
if (spool->max_hpages != -1)
spool->used_hpages -= gbl_reserve;
unlock_or_release_subpool(spool, flags);
}
out_uncharge_cgroup:
hugetlb_cgroup_uncharge_cgroup_rsvd(hstate_index(h),
chg * pages_per_huge_page(h), h_cg);

View File

@@ -1339,8 +1339,8 @@ static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int nr)
#endif /* CONFIG_MEM_ALLOC_PROFILING */
__always_inline bool free_pages_prepare(struct page *page,
unsigned int order)
__always_inline bool __free_pages_prepare(struct page *page,
unsigned int order, fpi_t fpi_flags)
{
int bad = 0;
bool skip_kasan_poison = should_skip_kasan_poison(page);
@@ -1433,7 +1433,7 @@ __always_inline bool free_pages_prepare(struct page *page,
page_table_check_free(page, order);
pgalloc_tag_sub(page, 1 << order);
if (!PageHighMem(page)) {
if (!PageHighMem(page) && !(fpi_flags & FPI_TRYLOCK)) {
debug_check_no_locks_freed(page_address(page),
PAGE_SIZE << order);
debug_check_no_obj_freed(page_address(page),
@@ -1472,6 +1472,11 @@ __always_inline bool free_pages_prepare(struct page *page,
return true;
}
bool free_pages_prepare(struct page *page, unsigned int order)
{
return __free_pages_prepare(page, order, FPI_NONE);
}
/*
* Frees a number of pages from the PCP lists
* Assumes all pages on list are in same zone.
@@ -1605,7 +1610,7 @@ static void __free_pages_ok(struct page *page, unsigned int order,
unsigned long pfn = page_to_pfn(page);
struct zone *zone = page_zone(page);
if (free_pages_prepare(page, order))
if (__free_pages_prepare(page, order, fpi_flags))
free_one_page(zone, page, pfn, order, fpi_flags);
}
@@ -2969,7 +2974,7 @@ static void __free_frozen_pages(struct page *page, unsigned int order,
return;
}
if (!free_pages_prepare(page, order))
if (!__free_pages_prepare(page, order, fpi_flags))
return;
/*
@@ -3031,7 +3036,7 @@ void free_unref_folios(struct folio_batch *folios)
unsigned long pfn = folio_pfn(folio);
unsigned int order = folio_order(folio);
if (!free_pages_prepare(&folio->page, order))
if (!__free_pages_prepare(&folio->page, order, FPI_NONE))
continue;
/*
* Free orders not handled on the PCP directly to the