Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
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


  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