From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56E7142FCC9 for ; Wed, 15 Jul 2026 18:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784140396; cv=none; b=GguomBRqhA+W7okLaNzL5QcAI2Hmwk+LKTXjpsHEaWn1Fw52n7OzbCOYSPB+dw4DbGLsDaEJZbALBuciFpHO701mOaBIn3bZ4TUIbIwY+BZMMRL1RZItwA0E4YaX055DcJiAv19HhFig8rKtPXREVSnLS6O1fh5c6EVBhLQyRdU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784140396; c=relaxed/simple; bh=MERuZTutTIJTzpezLFm4fLr5qNbc8OJeIZnlpd79Ovs=; h=Date:To:From:Subject:Message-Id; b=CvT6ZSvIX0yga25phqMIUhZosVARHQfRb8z2tYu27upu8ipZkUqXCoaNjqR2O6CpJxaDgzkNtCesSIiYx6lufftrWmYBHPphTZBBl4Fp2i9jidDmVQrz41zVTxBe9Ug7SYJRyoyRXmL+3ucIZFmXOIEdhXwicMPjI155/0nPAHg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b=HI7yWPZA; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux-foundation.org header.i=@linux-foundation.org header.b="HI7yWPZA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4C9E31F00A3E; Wed, 15 Jul 2026 18:32:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux-foundation.org; s=korg; t=1784140378; bh=woqy9vULnBYlVZyRbdCDnZRGe3UHhW8xDWWTifgZx5w=; h=Date:To:From:Subject; b=HI7yWPZAoN1QWy9Iw8Aabm+oGOG/A4qyxRGVTZMAcsLfP1bURt4VcOzEObXE4b2IC PWuAjDFbXBvanvfPuw/jZTdKHW5kpcF9fHQvrjT0jVUIRD5awiU2QzkfZTOgxP50cO Uh8TVlzT1K6sECHB1WKD5b/LreIMtRNn8JO4Peb8= Date: Wed, 15 Jul 2026 11:32:57 -0700 To: mm-commits@vger.kernel.org,baohua@kernel.org,akpm@linux-foundation.org From: Andrew Morton Subject: [to-be-updated] mm-vmalloc-map-contiguous-pages-in-batches-for-vmap-if-possible.patch removed from -mm tree Message-Id: <20260715183258.4C9E31F00A3E@smtp.kernel.org> Precedence: bulk X-Mailing-List: mm-commits@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: The quilt patch titled Subject: mm/vmalloc: map contiguous pages in batches for vmap() if possible has been removed from the -mm tree. Its filename was mm-vmalloc-map-contiguous-pages-in-batches-for-vmap-if-possible.patch This patch was dropped because an updated version will be issued ------------------------------------------------------ From: "Barry Song (Xiaomi)" Subject: mm/vmalloc: map contiguous pages in batches for vmap() if possible Date: Thu, 9 Jul 2026 15:38:22 +0800 In many cases, the pages passed to vmap() may include high-order pages. For example, the systemheap often allocates pages in descending order: order 8, then 4, then 0. Currently, vmap() iterates over every page individually—even pages inside a high-order block are handled one by one. This patch detects physically contiguous pages (regardless of whether they are compound or non-compound) by scanning with num_pages_contiguous(), and maps them as a single contiguous block whenever possible. The mapping order is determined by taking the minimum of the contiguous page count and the pfn alignment, allowing graceful degradation when pfn alignment is less than the contiguous range. Pages with the same page_shift are coalesced and mapped via vmap_pages_range_noflush_walk() to avoid page table rewalk. As users typically allocate memory in descending orders (e.g. 8 → 4 → 0), once an order-0 page is encountered, we stop scanning for contiguous pages since subsequent pages are likely order-0 as well. Link: https://lore.kernel.org/20260709073823.6643-6-jiangwen6@xiaomi.com Signed-off-by: Barry Song (Xiaomi) Co-developed-by: Dev Jain Signed-off-by: Dev Jain Signed-off-by: Wen Jiang Tested-by: Xueyuan Chen Tested-by: Leo Yan Reviewed-by: Dev Jain Cc: Andrew Donnellan Cc: Anshuman Khandual Cc: Catalin Marinas Cc: David Hildenbrand Cc: Mike Rapoport Cc: Ryan Roberts Cc: "Uladzislau Rezki (Sony)" Cc: Wen Jiang Cc: Will Deacon Signed-off-by: Andrew Morton --- mm/vmalloc.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 2 deletions(-) --- a/mm/vmalloc.c~mm-vmalloc-map-contiguous-pages-in-batches-for-vmap-if-possible +++ a/mm/vmalloc.c @@ -3572,6 +3572,89 @@ void vunmap(const void *addr) } EXPORT_SYMBOL(vunmap); +static inline unsigned int vm_shift(pgprot_t prot, unsigned long size) +{ + if (arch_vmap_pmd_supported(prot) && size >= PMD_SIZE) + return PMD_SHIFT; + + return arch_vmap_pte_supported_shift(size); +} + +static inline int get_vmap_batch_order(struct page **pages, + pgprot_t prot, unsigned int max_steps, unsigned int idx) +{ + unsigned int nr_contig; + int order; + + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) + return 0; + + nr_contig = num_pages_contiguous(&pages[idx], max_steps); + if (nr_contig < 2) + return 0; + + order = ilog2(nr_contig); + + /* Limit order by pfn alignment */ + order = min_t(int, order, __ffs(page_to_pfn(pages[idx]))); + + if (vm_shift(prot, PAGE_SIZE << order) == PAGE_SHIFT) + return 0; + + return order; +} + +static int vmap_pages_range_batched(unsigned long addr, unsigned long end, + pgprot_t prot, struct page **pages) +{ + unsigned int count = (end - addr) >> PAGE_SHIFT; + unsigned int prev_shift = 0, idx = 0; + unsigned long map_addr = addr, batch_end = addr; + int err; + + err = kmsan_vmap_pages_range_noflush(addr, end, prot, pages, + PAGE_SHIFT, GFP_KERNEL); + if (err) + goto out; + + for (unsigned int i = 0; i < count; ) { + unsigned int shift = PAGE_SHIFT + + get_vmap_batch_order(pages, prot, count - i, i); + + if (!i) + prev_shift = shift; + + if (shift != prev_shift) { + err = vmap_pages_range_noflush_walk(map_addr, batch_end, + prot, pages + idx, prev_shift); + if (err) + goto out; + prev_shift = shift; + map_addr = batch_end; + idx = i; + } + + /* + * Once small pages are encountered, the remaining pages + * are likely small as well. + */ + if (shift == PAGE_SHIFT) + break; + + batch_end += 1UL << shift; + i += 1U << (shift - PAGE_SHIFT); + } + + /* Remaining */ + if (map_addr < end) + err = vmap_pages_range_noflush_walk(map_addr, end, + prot, pages + idx, prev_shift); + +out: + flush_cache_vmap(addr, end); + return err; +} + /** * vmap - map an array of pages into virtually contiguous space * @pages: array of page pointers @@ -3615,8 +3698,8 @@ void *vmap(struct page **pages, unsigned return NULL; addr = (unsigned long)area->addr; - if (vmap_pages_range(addr, addr + size, pgprot_nx(prot), - pages, PAGE_SHIFT) < 0) { + if (vmap_pages_range_batched(addr, addr + size, pgprot_nx(prot), + pages) < 0) { vunmap(area->addr); return NULL; } _ Patches currently in -mm which might be from baohua@kernel.org are mm-avoid-unnecessary-lru-drain-for-wp_can_reuse_anon_folio.patch mm-avoid-unnecessary-lru-drain-for-wp_can_reuse_anon_folio-fix.patch mm-drop-stale-folio_ref_count==1-check-in-do_swap_page-reuse-logic.patch mm-entirely-remove-lru_add_drain-in-do_swap_page.patch mm-clarify-the-folio_free_swap-for-do_swap_page.patch mm-vmalloc-align-vm_area-so-vmap-can-batch-mappings.patch