Skip to content

Commit eb81b91

Browse files
Alexander Gordeevgregkh
authored andcommitted
mm/vmalloc: leave lazy MMU mode on PTE mapping error
commit fea18c6 upstream. vmap_pages_pte_range() enters the lazy MMU mode, but fails to leave it in case an error is encountered. Link: https://lkml.kernel.org/r/20250623075721.2817094-1-agordeev@linux.ibm.com Fixes: 2ba3e69 ("mm/vmalloc: track which page-table levels were modified") Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@linaro.org> Closes: https://lore.kernel.org/r/202506132017.T1l1l6ME-lkp@intel.com/ Reviewed-by: Ryan Roberts <ryan.roberts@arm.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 0e8776b commit eb81b91

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

mm/vmalloc.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
467467
unsigned long end, pgprot_t prot, struct page **pages, int *nr,
468468
pgtbl_mod_mask *mask)
469469
{
470+
int err = 0;
470471
pte_t *pte;
471472

472473
/*
@@ -480,18 +481,25 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
480481
do {
481482
struct page *page = pages[*nr];
482483

483-
if (WARN_ON(!pte_none(*pte)))
484-
return -EBUSY;
485-
if (WARN_ON(!page))
486-
return -ENOMEM;
487-
if (WARN_ON(!pfn_valid(page_to_pfn(page))))
488-
return -EINVAL;
484+
if (WARN_ON(!pte_none(*pte))) {
485+
err = -EBUSY;
486+
break;
487+
}
488+
if (WARN_ON(!page)) {
489+
err = -ENOMEM;
490+
break;
491+
}
492+
if (WARN_ON(!pfn_valid(page_to_pfn(page)))) {
493+
err = -EINVAL;
494+
break;
495+
}
489496

490497
set_pte_at(&init_mm, addr, pte, mk_pte(page, prot));
491498
(*nr)++;
492499
} while (pte++, addr += PAGE_SIZE, addr != end);
493500
*mask |= PGTBL_PTE_MODIFIED;
494-
return 0;
501+
502+
return err;
495503
}
496504

497505
static int vmap_pages_pmd_range(pud_t *pud, unsigned long addr,

0 commit comments

Comments
 (0)