CVE-2026-53207

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

MEDIUM
5.5
CVSS Score
Published: June 25, 2026 at 08:39 AM UTC
Updated: July 2, 2026 at 09:08 PM UTC
1 product affected across 1 vendorLinux Kernel

Using Linux by Linux?

Get instant alerts when new vulnerabilities affect Linux - before attackers find them.

Real-time alertsTrack your software stackFree plan available
Severity
MEDIUM5.5
Exploit prediction
EPSS 0.1%

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. [[email protected]: fix race, rename label per Miaohe]

Affected

Our own answer: ranges merged, affected separated from platform-only, with confidence and review flags.

v ≥ 5.15.545.15.54 ≤ v < 5.165.18 ≤ v < 6.1.1765.18 ≤ v < 6.12.945.18 ≤ v < 6.18.365.18 ≤ v < 6.6.1435.18 ≤ v < 7.0.135.18 ≤ v < 7.15.18.1 ≤ v < 6.1.1766.13 ≤ v < 6.18.366.19 ≤ v < 7.0.136.2 ≤ v < 6.6.1436.7 ≤ v < 6.12.94405ce051236cc65b30bbfe490b28ce60ae6aed855.15.545.185.18 rc45.18 rc55.18 rc65.18 rc762d1655b922958826b7ec22682c3141746f750647.1 rc17.1 rc27.1 rc37.1 rc47.1 rc57.1 rc6
Vendor states this is fixed in 3c2d42b8ee345b17a4ba56b0f6492d1ff4c1178e (fixed)
Vendor states this is fixed in 77b73b54801ae7137479c141fd0473a491c1dc48 (fixed)
Vendor states this is fixed in a33bfed648c10f5a1519981dbfad80841191edc8 (fixed)
Vendor states this is fixed in bf7ba8f96c258c30393814491930ae4ecdc5fe5e (fixed)
Vendor states this is fixed in dd77a83915b07e2b0205adb284f08b39ae31dc4b (fixed)
Vendor states this is fixed in fc3ff42cb0cbf947e4600ae9761c3783760050e2 (fixed)
Affected range stops below 5.16, so it looks safe — our inference, not a vendor statement
Vendor states this is fixed in 5.18 (unaffected)
Vendor states this is fixed in 6.1.176 (unaffected)
Vendor states this is fixed in 6.12.94 (unaffected)
Vendor states this is fixed in 6.18.36 (unaffected)
Vendor states this is fixed in 6.6.143 (unaffected)
Vendor states this is fixed in 7.0.13 (unaffected)
Vendor states this is fixed in 7.1 (unaffected)

CVSS

Attack Vector
LOCAL
Complexity
LOW
Privileges
LOW
User Interaction
NONE
Scope
UNCHANGED
Confidentiality
NONE
Integrity
NONE
Availability
HIGH
Vector?

Quick Info

StatusANALYZED
CWE
CWE-667

Get alerted

Stop reading CVE feeds looking for your own stack

Track the products you run and VulnTracker tells you when a new CVE affects them — with what is known about fixing it, and nothing about the rest.

Free plan, no card