CVE-2026-53207

mm/memory-failure: fix hugetlb_lock AA deadlock in get_huge_page_for_hwpoison

State
Published
Severity
Not scored
Published
Jun 25, 2026
Updated
Jun 25, 2026
Reserved
Jun 9, 2026

Read the record on cve.org

Description

In the Linux kernel, the following vulnerability has been resolved:

mm/memory-failure: fix hugetlb_lock AA deadlock in get_huge_page_for_hwpoison

Two concurrent madvise(MADV_HWPOISON) calls on the same hugetlb page can trigger a recursive spinlock self-deadlock (AA deadlock) on hugetlb_lock when racing with a concurrent unmap:

thread#0 thread#1 -------- -------- madvise(folio, MADV_HWPOISON) -> poisons the folio successfully madvise(folio, MADV_HWPOISON) unmap(folio) try_memory_failure_hugetlb get_huge_page_for_hwpoison spin_lock_irq(&hugetlb_lock) <- held __get_huge_page_for_hwpoison hugetlb_update_hwpoison() -> MF_HUGETLB_FOLIO_PRE_POISONED goto out: folio_put() refcount: 1 -> 0 free_huge_folio() spin_lock_irqsave(&hugetlb_lock) -> AA DEADLOCK!

The out: path in __get_huge_page_for_hwpoison() calls folio_put() to drop the GUP reference while the hugetlb_lock is still held by the hugetlb.c wrapper get_huge_page_for_hwpoison(). If concurrent unmap has released the page table mapping reference, folio_put() drops the folio refcount to zero, triggering free_huge_folio() which attempts to re-acquire the non-recursive hugetlb_lock.

Fix this by moving hugetlb_lock acquisition from the hugetlb.c wrapper into get_huge_page_for_hwpoison(). Place spin_unlock_irq() before the folio_put() at the out: label so the folio is always released outside the lock.

[akpm@linux-foundation.org: fix race, rename label per Miaohe]

Scores

The record has no CVSS score.

Weaknesses

The record names no weakness.

Affected Products

ProductVersions
LinuxLinux
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before fc3ff42cb0cbf947e4600ae9761c3783760050e2Affected
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before 77b73b54801ae7137479c141fd0473a491c1dc48Affected
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before a33bfed648c10f5a1519981dbfad80841191edc8Affected
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before dd77a83915b07e2b0205adb284f08b39ae31dc4bAffected
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before bf7ba8f96c258c30393814491930ae4ecdc5fe5eAffected
  • 405ce051236cc65b30bbfe490b28ce60ae6aed85 to before 3c2d42b8ee345b17a4ba56b0f6492d1ff4c1178eAffected
  • 62d1655b922958826b7ec22682c3141746f75064Affected
  • 5.15.54 to before 5.16Affected
LinuxLinux
  • 5.18Affected
  • before 5.18Not affected
  • 6.1.176 through 6.1.*Not affected
  • 6.6.143 through 6.6.*Not affected
  • 6.12.94 through 6.12.*Not affected
  • 6.18.36 through 6.18.*Not affected
  • 7.0.13 through 7.0.*Not affected
  • 7.1 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.