From: Uladzislau Rezki <urezki@gmail.com>
To: Dev Jain <dev.jain@arm.com>
Cc: Wen Jiang <jiangwenxiaomi@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
catalin.marinas@arm.com, linux-mm@kvack.org, urezki@gmail.com,
will@kernel.org, Xueyuan.chen21@gmail.com, ajd@linux.ibm.com,
anshuman.khandual@arm.com, david@kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, rppt@kernel.org,
ryan.roberts@arm.com, Wen Jiang <jiangwen6@xiaomi.com>
Subject: Re: [PATCH v6 0/6] mm/vmalloc: Speed up ioremap, vmalloc and vmap with contiguous memory
Date: Mon, 13 Jul 2026 19:30:40 +0200 [thread overview]
Message-ID: <alUgwPT9uh_EWItt@milan> (raw)
In-Reply-To: <54434a84-51b3-4e3f-988b-6bcbac5a2f42@arm.com>
On Mon, Jul 13, 2026 at 08:43:14PM +0530, Dev Jain wrote:
>
>
> On 10/07/26 2:24 pm, Wen Jiang wrote:
> > On Fri, 10 Jul 2026 at 07:08, Andrew Morton <akpm@linux-foundation.org> wrote:
> >>
> >> On Thu, 9 Jul 2026 15:38:17 +0800 Wen Jiang <jiangwenxiaomi@gmail.com> wrote:
> >>
> >>> This patchset accelerates ioremap, vmalloc, and vmap when the memory
> >>> is physically fully or partially contiguous.
> >>
> >> Thanks, I added this to mm.git's mm-new branch for wider testing.
> >>
> >> AI review asked some questions, and some of them are new since the v5
> >> series:
> >> https://sashiko.dev/#/patchset/20260709073823.6643-1-jiangwen6@xiaomi.com
> >
> > Hi Andrew,
> >
> > I've gone through the Sashiko findings:
> >
> > - Patch 1 (find_num_contig): Over-interpretation. No new hugetlbfs hstate
> > is added. The extra sizes are only used by init_mm kernel mappings via.
> >
> > - Patch 5/6 (NULL page): Invalid input. vmap() expects a fully populated
> > array of valid struct page pointers.
>
> Correct, but vmap_pages_pte_range has !page and !pfn_valid checks.
>
> I really hate those checks - if those checks have any remote possibility of
> firing, then we already have a bug at
>
> vm_map_ram -> vmap_pages_range -> vmap_pages_range_noflush -> kmsan_vmap_pages_range_noflush
>
> because the last function dereferences the struct page pointers.
>
> It is painful to do the page array sanity check deep into vmap - it implies
> we simply cannot play with the page array before that.
>
> But since vmap is an exported function, doing a sanity check for the page array
> in the vmap code makes sense.
>
> So how about the following:
>
> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index afaa14ebf17bb..0c44bb7a45b5d 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -566,14 +566,6 @@ static int vmap_pages_pte_range(pmd_t *pmd, unsigned long addr,
> err = -EBUSY;
> break;
> }
> - if (WARN_ON(!page)) {
> - err = -ENOMEM;
> - break;
> - }
> - if (WARN_ON(!pfn_valid(page_to_pfn(page)))) {
> - err = -EINVAL;
> - break;
> - }
>
> pfn = page_to_pfn(page);
> size = vmap_set_ptes(pte, addr, end, pfn, prot, shift);
> @@ -603,11 +595,6 @@ static int vmap_pages_pmd_range(pud_t *pud, unsigned long addr,
> struct page *page = pages[*nr];
> phys_addr_t phys_addr;
>
> - if (WARN_ON(!page))
> - return -ENOMEM;
> - if (WARN_ON(!pfn_valid(page_to_pfn(page))))
> - return -EINVAL;
> -
> phys_addr = page_to_phys(page);
>
> if (vmap_try_huge_pmd(pmd, addr, next, phys_addr, prot,
> @@ -3663,6 +3650,19 @@ static struct vm_struct *vmap_get_aligned_vm_area(unsigned long size,
> return __get_vm_area_node_aligned_caller(size, PAGE_SIZE, flags, caller);
> }
>
> +static inline bool vmap_page_sanity_checks(struct page **pages, unsigned int count)
> +{
> + for (int i = 0; i < count; ++i) {
> + if (WARN_ON(!pages[i]))
> + return true;
> +
> + if (WARN_ON(!pfn_valid(page_to_pfn(pages[i]))))
> + return true;
> + }
> +
> + return false;
> +}
> +
> /**
> * vmap - map an array of pages into virtually contiguous space
> * @pages: array of page pointers
> @@ -3706,6 +3706,9 @@ void *vmap(struct page **pages, unsigned int count,
> if (!area)
> return NULL;
>
> + if (unlikely(vmap_page_sanity_checks(pages, count)))
> + return NULL;
> +
> addr = (unsigned long)area->addr;
> if (vmap_pages_range_batched(addr, addr + size, pgprot_nx(prot),
> pages) < 0) {
>
>
>
> Reasoning for calling vmap_page_sanity_checks() before vmap_pages_range_batched,
> and not at the start of vmap: I am worried that since vmap() is already very
> fast, we may cause a regression:
>
> vmap() -> scan page array with linear map pointers -> vmap_get_aligned_vm_area (does
> memory allocation, throwing out the linear map VAs from cache and TLB) -> walk
> the pgtables and again access cold page array.
>
> Perhaps I am being very pedantic here. What do you think?
>
Sanity check adds extra CPU cycles and it adds overhead. The concern about cache
to be cold on second iteration looks valid. You can get some perf figures to see
the cost.
I would just keep the original approach. But no strong opinion here.
--
Uladzislau Rezki
next prev parent reply other threads:[~2026-07-13 17:30 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 7:38 [PATCH v6 0/6] mm/vmalloc: Speed up ioremap, vmalloc and vmap with contiguous memory Wen Jiang
2026-07-09 7:38 ` [PATCH v6 1/6] arm64/hugetlb: Extend batching of multiple CONT_PTE in a single PTE setup Wen Jiang
2026-07-14 6:54 ` Anshuman Khandual
2026-07-14 8:35 ` Wen Jiang
2026-07-09 7:38 ` [PATCH v6 2/6] arm64/vmalloc: Allow arch_vmap_pte_range_map_size to batch multiple CONT_PTE Wen Jiang
2026-07-14 7:13 ` Anshuman Khandual
2026-07-14 9:24 ` Wen Jiang
2026-07-09 7:38 ` [PATCH v6 3/6] mm/vmalloc: Extract vmap_set_ptes() to consolidate PTE mapping logic Wen Jiang
2026-07-09 7:38 ` [PATCH v6 4/6] mm/vmalloc: Extend page table walk to support larger page_shift sizes and eliminate page table rewalk Wen Jiang
2026-07-13 13:49 ` Dev Jain
2026-07-14 6:10 ` Wen Jiang
2026-07-14 6:45 ` Dev Jain
2026-07-09 7:38 ` [PATCH v6 5/6] mm/vmalloc: map contiguous pages in batches for vmap() if possible Wen Jiang
2026-07-13 15:19 ` Dev Jain
2026-07-14 5:16 ` Wen Jiang
2026-07-14 5:33 ` Dev Jain
2026-07-14 4:59 ` Dev Jain
2026-07-09 7:38 ` [PATCH v6 6/6] mm/vmalloc: align vm_area so vmap() can batch mappings Wen Jiang
2026-07-14 5:05 ` Dev Jain
2026-07-09 23:08 ` [PATCH v6 0/6] mm/vmalloc: Speed up ioremap, vmalloc and vmap with contiguous memory Andrew Morton
2026-07-10 8:54 ` Wen Jiang
2026-07-10 8:59 ` Wen Jiang
2026-07-13 15:13 ` Dev Jain
2026-07-13 17:30 ` Uladzislau Rezki [this message]
2026-07-14 4:34 ` Dev Jain
2026-07-14 8:36 ` Anshuman Khandual
2026-07-14 11:17 ` Dev Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alUgwPT9uh_EWItt@milan \
--to=urezki@gmail.com \
--cc=Xueyuan.chen21@gmail.com \
--cc=ajd@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=anshuman.khandual@arm.com \
--cc=catalin.marinas@arm.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=jiangwen6@xiaomi.com \
--cc=jiangwenxiaomi@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox