Skip to content

Commit aed6834

Browse files
Alexander Gordeevopsiff
authored andcommitted
mm/vmalloc: leave lazy MMU mode on PTE mapping error
commit fea18c686320a53fce7ad62a87a3e1d10ad02f31 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/[email protected] Fixes: 2ba3e69 ("mm/vmalloc: track which page-table levels were modified") Signed-off-by: Alexander Gordeev <[email protected]> Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> Closes: https://lore.kernel.org/r/[email protected]/ Reviewed-by: Ryan Roberts <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> (cherry picked from commit 4c39dfd13beb1c17fb92c9ef8d98b5d4c6cb0b42)
1 parent e20e495 commit aed6834

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

mm/vmalloc.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
487487
unsigned long end, pgprot_t prot, struct page **pages, int *nr,
488488
pgtbl_mod_mask *mask)
489489
{
490+
int err = 0;
490491
pte_t *pte;
491492

492493
/*
@@ -500,18 +501,25 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
500501
do {
501502
struct page *page = pages[*nr];
502503

503-
if (WARN_ON(!pte_none(ptep_get(pte))))
504-
return -EBUSY;
505-
if (WARN_ON(!page))
506-
return -ENOMEM;
507-
if (WARN_ON(!pfn_valid(page_to_pfn(page))))
508-
return -EINVAL;
504+
if (WARN_ON(!pte_none(ptep_get(pte)))) {
505+
err = -EBUSY;
506+
break;
507+
}
508+
if (WARN_ON(!page)) {
509+
err = -ENOMEM;
510+
break;
511+
}
512+
if (WARN_ON(!pfn_valid(page_to_pfn(page)))) {
513+
err = -EINVAL;
514+
break;
515+
}
509516

510517
set_pte_at(&init_mm, addr, pte, mk_pte(page, prot));
511518
(*nr)++;
512519
} while (pte++, addr += PAGE_SIZE, addr != end);
513520
*mask |= PGTBL_PTE_MODIFIED;
514-
return 0;
521+
522+
return err;
515523
}
516524

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

0 commit comments

Comments
 (0)