Skip to content

Commit eb81b91

Browse files
Alexander Gordeevgregkh
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]>
1 parent 0e8776b commit eb81b91

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
@@ -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)