Hi Dev Thanks for your review.
On 2026/10/30 15:29, Dev Jain wrote: > > > On 26/10/26 1:33 pm, Hao Ge wrote: >> vmap_pages_pmd_range(), vmap_pages_pud_range() and >> vmap_pages_p4d_range() return -ENOMEM whenever the level below them >> fails. But vmap_pages_pte_range() can also return -EINVAL for a >> page without a valid pfn and -EBUSY for a pte that is already >> mapped. Pass the error up as-is instead, like the vmap_p*d_range() >> helpers for vmap_page_range() do. >> >> Signed-off-by: Hao Ge <[email protected]> >> --- > > Fixes? > Sorry, I missed that. > Reviewed-by: Dev Jain <[email protected]> Thanks! If you have some time, I'd also appreciate a review of the remaining patches in the series -- or Suren and Uladzislau, if they get a chance. No rush, I know everyone is busy. Thanks Best Regards Hao > > >> mm/vmalloc.c | 24 +++++++++++++++--------- >> 1 file changed, 15 insertions(+), 9 deletions(-) >> >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >> index 7131f60d1a8e..d60b99b81ec9 100644 >> --- a/mm/vmalloc.c >> +++ b/mm/vmalloc.c >> @@ -600,16 +600,18 @@ static int vmap_pages_pmd_range(pud_t *pud, unsigned >> long addr, >> { >> pmd_t *pmd; >> unsigned long next; >> + int err = 0; >> >> pmd = pmd_alloc_track(&init_mm, pud, addr, mask); >> if (!pmd) >> return -ENOMEM; >> do { >> next = pmd_addr_end(addr, end); >> - if (vmap_pages_pte_range(pmd, addr, next, prot, pages, nr, >> mask)) >> - return -ENOMEM; >> + err = vmap_pages_pte_range(pmd, addr, next, prot, pages, nr, >> mask); >> + if (err) >> + break; >> } while (pmd++, addr = next, addr != end); >> - return 0; >> + return err; >> } >> >> static int vmap_pages_pud_range(p4d_t *p4d, unsigned long addr, >> @@ -618,16 +620,18 @@ static int vmap_pages_pud_range(p4d_t *p4d, unsigned >> long addr, >> { >> pud_t *pud; >> unsigned long next; >> + int err = 0; >> >> pud = pud_alloc_track(&init_mm, p4d, addr, mask); >> if (!pud) >> return -ENOMEM; >> do { >> next = pud_addr_end(addr, end); >> - if (vmap_pages_pmd_range(pud, addr, next, prot, pages, nr, >> mask)) >> - return -ENOMEM; >> + err = vmap_pages_pmd_range(pud, addr, next, prot, pages, nr, >> mask); >> + if (err) >> + break; >> } while (pud++, addr = next, addr != end); >> - return 0; >> + return err; >> } >> >> static int vmap_pages_p4d_range(pgd_t *pgd, unsigned long addr, >> @@ -636,16 +640,18 @@ static int vmap_pages_p4d_range(pgd_t *pgd, unsigned >> long addr, >> { >> p4d_t *p4d; >> unsigned long next; >> + int err = 0; >> >> p4d = p4d_alloc_track(&init_mm, pgd, addr, mask); >> if (!p4d) >> return -ENOMEM; >> do { >> next = p4d_addr_end(addr, end); >> - if (vmap_pages_pud_range(p4d, addr, next, prot, pages, nr, >> mask)) >> - return -ENOMEM; >> + err = vmap_pages_pud_range(p4d, addr, next, prot, pages, nr, >> mask); >> + if (err) >> + break; >> } while (p4d++, addr = next, addr != end); >> - return 0; >> + return err; >> } >> >> static int vmap_small_pages_range_noflush(unsigned long addr, unsigned long >> end, >
