Skip to content

Commit fea18c6

Browse files
Alexander Gordeevakpm00
authored andcommitted
mm/vmalloc: leave lazy MMU mode on PTE mapping error
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]>
1 parent 7627b45 commit fea18c6

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
@@ -514,6 +514,7 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
514514
unsigned long end, pgprot_t prot, struct page **pages, int *nr,
515515
pgtbl_mod_mask *mask)
516516
{
517+
int err = 0;
517518
pte_t *pte;
518519

519520
/*
@@ -530,20 +531,27 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
530531
do {
531532
struct page *page = pages[*nr];
532533

533-
if (WARN_ON(!pte_none(ptep_get(pte))))
534-
return -EBUSY;
535-
if (WARN_ON(!page))
536-
return -ENOMEM;
537-
if (WARN_ON(!pfn_valid(page_to_pfn(page))))
538-
return -EINVAL;
534+
if (WARN_ON(!pte_none(ptep_get(pte)))) {
535+
err = -EBUSY;
536+
break;
537+
}
538+
if (WARN_ON(!page)) {
539+
err = -ENOMEM;
540+
break;
541+
}
542+
if (WARN_ON(!pfn_valid(page_to_pfn(page)))) {
543+
err = -EINVAL;
544+
break;
545+
}
539546

540547
set_pte_at(&init_mm, addr, pte, mk_pte(page, prot));
541548
(*nr)++;
542549
} while (pte++, addr += PAGE_SIZE, addr != end);
543550

544551
arch_leave_lazy_mmu_mode();
545552
*mask |= PGTBL_PTE_MODIFIED;
546-
return 0;
553+
554+
return err;
547555
}
548556

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

0 commit comments

Comments
 (0)