From: sashiko-bot@kernel.org
To: "Wen Jiang" <jiangwenxiaomi@gmail.com>,
akpm@linux-foundation.org, catalin.marinas@arm.com,
linux-mm@kvack.org, urezki@gmail.com, will@kernel.org
Cc: "Xueyuan Chen" <xueyuan.chen21@gmail.com>,
ajd@linux.ibm.com, anshuman.khandual@arm.com, baohua@kernel.org,
chleroy@kernel.org, david@kernel.org, dev.jain@arm.com,
jiangwen6@xiaomi.com, leo.yan@arm.com, maddy@linux.ibm.com,
mpe@ellerman.id.au, npiggin@gmail.com, rppt@kernel.org,
ryan.roberts@arm.com
Subject: Re: [PATCH v11 05/10] arm64/vmalloc: allow arch_vmap_pte_range_map_size() to batch multiple CONT_PTE
Date: Wed, 04 Nov 2026 10:18:59 +0000 [thread overview]
Message-ID: <sashiko-outbox-197077@kernel.org> (raw)
In-Reply-To: <20261103101658.766905-6-jiangwenxiaomi@gmail.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Critical] arm64/vmalloc: physical block overrun in arch_vmap_pte_range_map_size()
--
commit 21610101d177ce2dfc10c0e91b5ac55eb277a5f9
Author: Barry Song (Xiaomi) <baohua@kernel.org>
arm64/vmalloc: allow arch_vmap_pte_range_map_size() to batch multiple CONT_PTE
This commit updates arch_vmap_pte_range_map_size() to return the largest
CONT_PTE_SIZE-aligned size that fits within the remaining range and the
caller's max_page_shift, allowing vmap_pte_set_huge() to install multiple
CONT_PTE blocks in a single call.
> diff --git a/arch/arm64/include/asm/vmalloc.h b/arch/arm64/include/asm/vmalloc.h
> index 4ec1acd3c1b34..c29704a19e276 100644
> --- a/arch/arm64/include/asm/vmalloc.h
> +++ b/arch/arm64/include/asm/vmalloc.h
> @@ -23,10 +23,12 @@ static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr,
> unsigned long end, u64 pfn,
> unsigned int max_page_shift)
> {
> + unsigned long size;
> +
> /*
> - * If the block is at least CONT_PTE_SIZE in size, and is naturally
> - * aligned in both virtual and physical space, then we can pte-map the
> - * block using the PTE_CONT bit for more efficient use of the TLB.
> + * If the range is at least CONT_PTE_SIZE and naturally aligned in both
> + * virtual and physical space, return the largest CONT_PTE-aligned size
> + * that fits, for more efficient use of the TLB.
> */
> if (max_page_shift < CONT_PTE_SHIFT)
> return PAGE_SIZE;
> @@ -40,7 +42,9 @@ static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr,
> if (!IS_ALIGNED(PFN_PHYS(pfn), CONT_PTE_SIZE))
> return PAGE_SIZE;
>
> - return CONT_PTE_SIZE;
> + size = min(end - addr, 1UL << max_page_shift);
> + size = round_down(size, CONT_PTE_SIZE);
> + return size;
[Severity: Critical]
As reported by David Carlier on v7 [1], can arch_vmap_pte_range_map_size()
overrun the current physically contiguous block when a PMD boundary splits a
coalesced batch?
In the batched vmap() path introduced later in this series:
vmap()
-> vmap_pages_range()
-> vmap_pages_range_noflush()
-> vmap_pages_range_batched()
-> vmap_pages_range_noflush_walk()
vmap_pages_range_batched() coalesces consecutive blocks that share the same
mapping shift (where shift > CONT_PTE_SHIFT) into a single walk over
[batch_start, batch_end). Within that coalesced range, pages[] is only
physically contiguous within each naturally aligned (1UL << max_page_shift)
block; separate blocks in the same batch are not physically contiguous with
each other.
If [batch_start, batch_end) is only aligned to CONT_PTE_SIZE and crosses a
PMD boundary mid-block, vmap_pages_pmd_range() splits the walk at
pmd_addr_end(addr, end). The first PMD maps the initial CONT_PTE_SIZE-aligned
portion of the block, advancing *nr into the middle of that physical block.
At the start of the next PMD, addr and PFN_PHYS(pfn) are still aligned to
CONT_PTE_SIZE, while end - addr includes the subsequent block(s) in the
batch. Because arch_vmap_pte_range_map_size() only checks
IS_ALIGNED(PFN_PHYS(pfn), CONT_PTE_SIZE) and does not bound size to the
remaining bytes in the current (1UL << max_page_shift) physical block, it can
return up to (1UL << max_page_shift) starting from a mid-block PFN.
Won't vmap_pte_set_huge() then map physical pages past the end of that block
while vmap_pages_pte_range() advances *nr past the start of the next block in
pages[], leaving the tail of pages[] unmapped?
[1] https://lore.kernel.org/r/20260721181729.305137-1-devnexen@gmail.com
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103101658.766905-1-jiangwenxiaomi@gmail.com?part=5
next prev parent reply other threads:[~2026-11-04 10:19 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 10:16 [PATCH v11 00/10] mm/vmalloc: Speed up ioremap, vmalloc and vmap with contiguous memory Wen Jiang
2026-11-03 10:16 ` [PATCH v11 01/10] arm64/mm: add vmap_pte_set_huge() and vmap_pte_clear_huge() Wen Jiang
2026-11-03 10:16 ` [PATCH v11 02/10] powerpc/8xx: add vmap_pte_set_huge() Wen Jiang
2026-11-03 10:16 ` [PATCH v11 03/10] mm/vmalloc: use vmap_pte_set_huge()/vmap_pte_clear_huge() for PTE-level block mappings Wen Jiang
2026-11-03 10:16 ` [PATCH v11 04/10] arm64/hugetlb: drop the init_mm special case in clear_flush() Wen Jiang
2026-11-03 10:16 ` [PATCH v11 05/10] arm64/vmalloc: allow arch_vmap_pte_range_map_size() to batch multiple CONT_PTE Wen Jiang
2026-11-04 10:18 ` sashiko-bot [this message]
2026-11-03 10:16 ` [PATCH v11 06/10] mm/vmalloc: extract vmap_set_ptes() to consolidate PTE mapping logic Wen Jiang
2026-11-03 10:16 ` [PATCH v11 07/10] mm/vmalloc: extend page table walk to support larger page_shift sizes and eliminate page table rewalk Wen Jiang
2026-11-03 10:16 ` [PATCH v11 08/10] mm/vmalloc: extract vm_shift() to consolidate mapping shift selection Wen Jiang
2026-11-03 10:16 ` [PATCH v11 09/10] mm/vmalloc: map contiguous pages in batches for vmap() if possible Wen Jiang
2026-11-04 10:19 ` sashiko-bot
2026-11-03 10:16 ` [PATCH v11 10/10] mm/vmalloc: align vm_area so vmap() can batch mappings Wen Jiang
2026-11-04 10:19 ` sashiko-bot
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=sashiko-outbox-197077@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ajd@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=anshuman.khandual@arm.com \
--cc=baohua@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=chleroy@kernel.org \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=jiangwen6@xiaomi.com \
--cc=jiangwenxiaomi@gmail.com \
--cc=leo.yan@arm.com \
--cc=linux-mm@kvack.org \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=npiggin@gmail.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=urezki@gmail.com \
--cc=will@kernel.org \
--cc=xueyuan.chen21@gmail.com \
/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