{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-98939", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2026-09-25T10:25:14.381Z", "datePublished": "2026-10-23T12:12:06.180Z", "dateUpdated": "2026-10-23T12:12:06.180Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-10-23T12:12:06.180Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nx86/mm: Drop unnecessary PMD page copy when freeing\n\nOn a box with a discrete GPU, lockdep reports a possible deadlock as\nsoon as kswapd shrinks the TTM page pool. The immediate cause is an\nx86 commit that added an mmap_read_lock() to kernel page protection\nmunging code.\n\nThe huge vmap code holds the same lock over a GFP_KERNEL allocation,\nwhich is a no-no now that reclaim can take it. That allocation is in a\npage table *free* path and ends up being for dubious purposes[1].\nBasically, it tries to avoid hardware setting Accessed=1 in page table\nentries that are unreachable by the hardware, a non-issue.\n\nRemove the PMD copy. Detach the original PMD page at the PUD, flush\nthe mid-level caches, and free the PTE tables straight from the\ndetached PMD page. With no allocation left, the locking issue is gone.\n\nLockdep splat/analysis:\n\n WARNING: possible circular locking dependency detected\n 7.3.0-rc3-f6e7b42bf05b+ #183 Tainted: G U\n ------------------------------------------------------\n kswapd0/269 is trying to acquire lock:\n ((init_mm).mmap_lock){++++}-{4:4}, at: change_page_attr_set_clr+0x29a/0x4a0\n but task is already holding lock:\n (pool_shrink_rwsem){.+.+}-{4:4}, at: ttm_pool_shrink+0xb2/0x330 [ttm]\n Chain exists of:\n (init_mm).mmap_lock --> fs_reclaim --> pool_shrink_rwsem\n\nThe cycle is built from three edges:\n\n 1) pool_shrink_rwsem -> (init_mm).mmap_lock\n\n The TTM shrinker restores the caching attribute of every page it\n frees, while holding pool_shrink_rwsem:\n\n ttm_pool_shrink()\n -> ttm_pool_dispose_list()\n -> ttm_pool_free_page()\n -> set_pages_wb()\n -> change_page_attr_set_clr() [ init_mm mmap read lock ]\n\n 2) fs_reclaim -> pool_shrink_rwsem\n\n The same shrinker, called from reclaim.\n\n 3) (init_mm).mmap_lock -> fs_reclaim\n\n ioremap() installing a huge PUD mapping over an existing PMD table:\n\n ioremap_page_range()\n -> vmap_range_noflush()\n -> vmap_try_huge_pud() [ init_mm mmap read lock ]\n -> pud_free_pmd_page()\n -> __get_free_page(GFP_KERNEL) [ enters reclaim ]\n\n[ dhansen: Lots of changelog munging/trimming and merged comments from my\n\t version of the fix. ]" } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "arch/x86/mm/pgtable.c" ], "versions": [ { "version": "e21a9ea81426a85fdb0cdcfcc99d5d9c16b402ab", "lessThan": "d3c2d2692bdf4af94bb27bc7a3aa0a348a567606", "status": "affected", "versionType": "git" }, { "version": "cc73b2043d106b467accd38e9b1fc09e0607c056", "lessThan": "f38c57a28ebbd057471573e39555d5aa11ab03cf", "status": "affected", "versionType": "git" }, { "version": "d5d8b8662e6e5a565b47a0388640e88402f23274", "lessThan": "e3ee38c1bc0b11a8d3e63dce7050759b61864286", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "arch/x86/mm/pgtable.c" ], "versions": [ { "version": "6.18.53", "lessThan": "6.18.56", "status": "affected", "versionType": "semver" }, { "version": "7.2.7", "lessThan": "7.2.10", "status": "affected", "versionType": "semver" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.18.53", "versionEndExcluding": "6.18.56" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "7.2.7", "versionEndExcluding": "7.2.10" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/d3c2d2692bdf4af94bb27bc7a3aa0a348a567606" }, { "url": "https://git.kernel.org/stable/c/f38c57a28ebbd057471573e39555d5aa11ab03cf" }, { "url": "https://git.kernel.org/stable/c/e3ee38c1bc0b11a8d3e63dce7050759b61864286" } ], "title": "x86/mm: Drop unnecessary PMD page copy when freeing", "x_generator": { "engine": "bippy-1.2.0" } } } }