From: Catalin Marinas <catalin.marinas@arm.com>
To: James Houghton <jthoughton@google.com>
Cc: Will Deacon <will@kernel.org>,
Muchun Song <muchun.song@linux.dev>,
Oscar Salvador <osalvador@suse.de>,
Nikos Nikoleris <nikos.nikoleris@arm.com>,
Linu Cherian <linu.cherian@arm.com>,
Mark Rutland <mark.rutland@arm.com>,
David Hildenbrand <david@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ryan Roberts <ryan.roberts@arm.com>,
Nanyong Sun <sunnanyong@huawei.com>, Yu Zhao <yuzhao@google.com>,
Frank van der Linden <fvdl@google.com>,
David Rientjes <rientjes@google.com>,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org
Subject: Re: [PATCH 11/18] hugetlb_vmemmap: Use try_populate_vmemmap_pmd for replacing in-use PMDs
Date: Tue, 18 Aug 2026 16:53:08 +0100 [thread overview]
Message-ID: <aoR_5LHPsVXUnxt6@arm.com> (raw)
In-Reply-To: <20260708031129.3503195-12-jthoughton@google.com>
On Wed, Jul 08, 2026 at 03:11:21AM +0000, James Houghton wrote:
> diff --git a/arch/arm64/include/asm/pgalloc.h b/arch/arm64/include/asm/pgalloc.h
> index 1b4509d3382c..c8946250d431 100644
> --- a/arch/arm64/include/asm/pgalloc.h
> +++ b/arch/arm64/include/asm/pgalloc.h
> @@ -121,4 +121,13 @@ pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep)
> PMD_TYPE_TABLE | PMD_TABLE_AF | PMD_TABLE_PXN);
> }
>
> +#define __HAVE_ARCH_TRY_POPULATE_VMEMMAP_PMD
> +static inline int try_populate_vmemmap_pmd(pmd_t *pmdp, pte_t *pgtable,
> + unsigned long addr)
> +{
> + /* BBML2_NOABORT is required. Its presence has been checked. */
> + pmd_populate_kernel(&init_mm, pmdp, pgtable);
> + return 0;
> +}
This patch adds the same function in 4 different arch files. Can we not
have a single generic implementation in linux/pgalloc.h, bracketed by
some ARCH_WANTS_* (macro or config)?
I think the same goes for patch 4 with try_update_vmemmap_pte(), we can
reduce the code duplication.
> diff --git a/include/linux/pgalloc.h b/include/linux/pgalloc.h
> index 9174fa59bbc5..ed446d95ca37 100644
> --- a/include/linux/pgalloc.h
> +++ b/include/linux/pgalloc.h
> @@ -26,4 +26,24 @@
> arch_sync_kernel_mappings(addr, addr); \
> } while (0)
>
> +#ifndef __HAVE_ARCH_TRY_POPULATE_VMEMMAP_PMD
> +/*
> + * try_populate_vmemmap_pmd - Populate a PMD that is in use by the vmemmap.
> + * @addr: Base address of the remapped PMD.
> + * @pmdp: Page table pointer to be overwritten.
> + * @pgtable: Pointer to the page table that the new PMD will point to.
> + *
> + * This function is only to be used to update PMDs that map the vmemmap to
> + * point to a page of already-populated PTEs that map the same pages.
> + *
> + * Implementations of this function must ensure that, while the update is taking
> + * place, CPUs will not fault on the remapped virtual address range.
> + */
> +static inline int try_populate_vmemmap_pmd(pmd_t *pmdp, pte_t *pgtable,
> + unsigned long addr)
Nit: if we follow try_update_vmemmap_pte(), we could place 'addr' first.
It matches pgd_populate_kernel() as well in this file.
> +{
> + return -EOPNOTSUPP;
> +}
> +#endif
> +
> #endif /* _LINUX_PGALLOC_H */
> diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
> index 977249e22ed0..b445febac0d2 100644
> --- a/mm/hugetlb_vmemmap.c
> +++ b/mm/hugetlb_vmemmap.c
> @@ -55,6 +55,7 @@ static int vmemmap_split_pmd(pmd_t *pmd, struct page *head, unsigned long start,
> struct vmemmap_remap_walk *walk)
> {
> pmd_t __pmd;
> + int ret;
> int i;
> unsigned long addr = start;
> pte_t *pgtable;
> @@ -74,8 +75,15 @@ static int vmemmap_split_pmd(pmd_t *pmd, struct page *head, unsigned long start,
> set_pte_at(&init_mm, addr, pte, entry);
> }
>
> + ret = 0;
> spin_lock(&init_mm.page_table_lock);
> if (likely(pmd_leaf(*pmd))) {
> + /* Make pte visible before pmd. See comment in pmd_install(). */
> + smp_wmb();
> + ret = try_populate_vmemmap_pmd(pmd, pgtable, start);
> + if (ret)
> + goto free;
> +
> /*
> * Higher order allocations from buddy allocator must be able to
> * be treated as independent small pages (as they can be freed
> @@ -84,21 +92,17 @@ static int vmemmap_split_pmd(pmd_t *pmd, struct page *head, unsigned long start,
> if (!PageReserved(head))
> split_page(head, get_order(PMD_SIZE));
>
> - /* Make pte visible before pmd. See comment in pmd_install(). */
> - smp_wmb();
> - /*
> - * On arm64, this requires BBML2_NOABORT. Its support has
> - * already been checked.
> - */
> - pmd_populate_kernel(&init_mm, pmd, pgtable);
> if (!(walk->flags & VMEMMAP_SPLIT_NO_TLB_FLUSH))
> flush_tlb_kernel_range(start, start + PMD_SIZE);
> - } else {
> - pte_free_kernel(&init_mm, pgtable);
> - }
> - spin_unlock(&init_mm.page_table_lock);
> + } else
> + goto free;
>
> - return 0;
> +out:
> + spin_unlock(&init_mm.page_table_lock);
> + return ret;
> +free:
> + pte_free_kernel(&init_mm, pgtable);
> + goto out;
> }
Would 'free' first with fall through 'out' read better?
--
Catalin
next prev parent reply other threads:[~2026-08-18 15:53 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-08 3:11 [PATCH 00/18] Another attempt at HVO support on arm64 James Houghton
2026-07-08 3:11 ` [PATCH 01/18] hugetlb_vmemmap: Always flush TLB if needed upon PTE remapping James Houghton
2026-07-08 3:11 ` [PATCH 02/18] hugetlb_vmemmap: Move vmemmap_get_tail up James Houghton
2026-07-08 3:11 ` [PATCH 03/18] hugetlb_vmemmap: Leave pages partially HVOed upon restore failure James Houghton
2026-08-18 14:07 ` Catalin Marinas
2026-07-08 3:11 ` [PATCH 04/18] hugetlb_vmemmap: Use try_update_vmemmap_pte to update in-use PTEs James Houghton
2026-07-08 3:11 ` [PATCH 05/18] hugetlb_vmemmap: Allow architectures not to allow HVO at runtime James Houghton
2026-07-08 3:11 ` [PATCH 06/18] arm64: Rename cpu_has_hw_af to system_has_hw_af James Houghton
2026-07-08 3:11 ` [PATCH 07/18] arm64: Add system_supports_hvo James Houghton
2026-08-18 14:07 ` Catalin Marinas
2026-07-08 3:11 ` [PATCH 08/18] arm64: Implement try_update_vmemmap_pte using the AF trick James Houghton
2026-08-18 14:10 ` Catalin Marinas
2026-07-08 3:11 ` [PATCH 09/18] arm64: Prevent HVO if the HVO system feature is not enabled James Houghton
2026-07-08 3:11 ` [PATCH 10/18] arm64: Support hugetlb vmemmap optimization James Houghton
2026-08-18 14:16 ` Catalin Marinas
2026-07-08 3:11 ` [PATCH 11/18] hugetlb_vmemmap: Use try_populate_vmemmap_pmd for replacing in-use PMDs James Houghton
2026-08-18 15:53 ` Catalin Marinas [this message]
2026-07-08 3:11 ` [PATCH 12/18] arm64: Implement try_populate_vmemmap_pmd using AF trick James Houghton
2026-08-18 16:33 ` Catalin Marinas
2026-07-08 3:11 ` [PATCH 13/18] arm64: Drop BBML2_NOABORT requirement for HVO James Houghton
2026-07-08 3:11 ` [PATCH 14/18] hugetlb_vmemmap: Rename mm/hugetlb_vmemmap.h to mm/hugetlb_vmemmap_internal.h James Houghton
2026-07-08 3:11 ` [PATCH 15/18] hugetlb_vmemmap: Add a way to permanently disable HVO when needed James Houghton
2026-07-08 3:11 ` [PATCH 16/18] arm64: Allow "optional" CPU features to be required sometimes James Houghton
2026-07-08 3:11 ` [PATCH 17/18] arm64: Permit onlining of HVO-incompatible late CPUs if HVO is not in use James Houghton
2026-07-08 3:11 ` [PATCH 18/18] arm64: Remove user-selectable HVO Kconfig James Houghton
2026-07-08 8:40 ` [PATCH 00/18] Another attempt at HVO support on arm64 Muchun Song
2026-07-08 16:49 ` James Houghton
2026-07-09 9:54 ` Muchun Song
2026-07-09 19:04 ` James Houghton
2026-07-10 3:40 ` Muchun Song
2026-07-13 4:09 ` James Houghton
2026-07-14 6:40 ` Muchun Song
2026-07-11 2:22 ` Muchun Song
2026-07-13 4:09 ` James Houghton
2026-07-09 9:58 ` David Hildenbrand (Arm)
2026-07-10 4:58 ` Muchun Song
2026-07-13 4:59 ` James Houghton
2026-07-13 7:41 ` Muchun Song
2026-07-13 11:26 ` Dev Jain
2026-07-14 8:46 ` Pedro Falcato
2026-07-15 9:38 ` James Houghton
2026-08-17 17:34 ` Catalin Marinas
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=aoR_5LHPsVXUnxt6@arm.com \
--to=catalin.marinas@arm.com \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=fvdl@google.com \
--cc=jthoughton@google.com \
--cc=linu.cherian@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=muchun.song@linux.dev \
--cc=nikos.nikoleris@arm.com \
--cc=osalvador@suse.de \
--cc=rientjes@google.com \
--cc=ryan.roberts@arm.com \
--cc=sunnanyong@huawei.com \
--cc=will@kernel.org \
--cc=yuzhao@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.