]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/migrate_device: fix pgtable leak in migrate_vma_insert_huge_pmd_page
authorSunny Patel <nueralspacetech@gmail.com>
Fri, 1 May 2026 11:51:16 +0000 (17:21 +0530)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 22 May 2026 02:06:13 +0000 (19:06 -0700)
When migrate_vma_insert_huge_pmd_page() jumps to unlock_abort due
to a PMD check failure, the pgtable allocated earlier via
pte_alloc_one() is never freed, causing a memory leak.

Added free_abort label to release the pgtable in error path.

Link: https://lore.kernel.org/20260501115122.23288-1-nueralspacetech@gmail.com
Fixes: a30b48bf1b24 ("mm/migrate_device: implement THP migration of zone device pages")
Signed-off-by: Sunny Patel <nueralspacetech@gmail.com>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Huang Ying <ying.huang@linux.alibaba.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Byungchul Park <byungchul@sk.com>
Cc: Gregory Price <gourry@gourry.net>
Cc: Joshua Hahn <joshua.hahnjy@gmail.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Rakie Kim <rakie.kim@sk.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/migrate_device.c

index ab49d4dcdb60d22790451dc6bb3212824c480bc6..19cd14b3411469763b5eebc25a8483c940bb443c 100644 (file)
@@ -840,7 +840,7 @@ static int migrate_vma_insert_huge_pmd_page(struct migrate_vma *migrate,
        } else {
                if (folio_is_zone_device(folio) &&
                    !folio_is_device_coherent(folio)) {
-                       goto abort;
+                       goto free_abort;
                }
                entry = folio_mk_pmd(folio, vma->vm_page_prot);
                if (vma->vm_flags & VM_WRITE)
@@ -893,6 +893,8 @@ static int migrate_vma_insert_huge_pmd_page(struct migrate_vma *migrate,
 
 unlock_abort:
        spin_unlock(ptl);
+free_abort:
+       pte_free(vma->vm_mm, pgtable);
 abort:
        for (i = 0; i < HPAGE_PMD_NR; i++)
                src[i] &= ~MIGRATE_PFN_MIGRATE;