From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Dave Hansen <dave.hansen@linux.intel.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Morton <akpm@linux-foundation.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Brendan Jackman <jackmanb@google.com>,
Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Gerald Schaefer <gerald.schaefer@linux.ibm.com>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Muchun Song <muchun.song@linux.dev>,
Oscar Salvador <osalvador@suse.de>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linux-s390@vger.kernel.org
Subject: Re: [PATCH 02/10] mm: provide free_reserved_pages(), removing x86 variant
Date: Wed, 8 Jul 2026 17:13:21 +0200 [thread overview]
Message-ID: <dd1bfb6a-4e3d-40dc-b1b1-6c169279b366@kernel.org> (raw)
In-Reply-To: <20260708-bootmem_info_part2-v1-2-156ce4986598@kernel.org>
On 7/8/26 16:10, David Hildenbrand (Arm) wrote:
> Let's extend free_reserved_page() in page_alloc.c to free_reserved_pages(),
> dropping the custom x86 variant. The common-code variant will consume an
> order, so adjust the x86 callers accordingly.
>
> Make free_reserved_pages() assume that we are freeing ordinary
> high-order pages, just with the special "reserved" flavor. The target
> use case for now is freeing vmemmap PMD pages.
>
> Set the refcount directly to 0 (instead of 1) and call
> __free_frozen_pages(). Add some kerneldoc. Use a single
> adjust_managed_page_count() call.
>
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
> arch/x86/mm/init_64.c | 8 +-------
> include/linux/mm.h | 8 ++++++--
> mm/page_alloc.c | 33 ++++++++++++++++++++++++++-------
> 3 files changed, 33 insertions(+), 16 deletions(-)
>
> diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
> index 69e36f02a663a..320e742b0bb3f 100644
> --- a/arch/x86/mm/init_64.c
> +++ b/arch/x86/mm/init_64.c
> @@ -1000,12 +1000,6 @@ int arch_add_memory(int nid, u64 start, u64 size,
> return add_pages(nid, start_pfn, nr_pages, params);
> }
>
> -static void free_reserved_pages(struct page *page, unsigned long nr_pages)
> -{
> - while (nr_pages--)
> - free_reserved_page(page++);
> -}
> -
> static void __meminit free_pagetable(struct page *page)
> {
> /* bootmem page has reserved flag */
> @@ -1038,7 +1032,7 @@ static void __meminit free_vmemmap_pages(struct page *page, unsigned int order,
> while (nr_pages--)
> put_page_bootmem(page++);
> } else {
> - free_reserved_pages(page, nr_pages);
> + free_reserved_pages(page, order);
> }
> } else {
> __free_pages(page, order);
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 113e1752548c2..62b261cccf16f 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -3993,8 +3993,12 @@ extern unsigned long free_reserved_area(void *start, void *end,
>
> extern void adjust_managed_page_count(struct page *page, long count);
>
> -/* Free the reserved page into the buddy system, so it gets managed. */
> -void free_reserved_page(struct page *page);
> +void free_reserved_pages(struct page *page, unsigned int order);
> +
> +static inline void free_reserved_page(struct page *page)
> +{
> + free_reserved_pages(page, 0);
> +}
>
> static inline void mark_page_reserved(struct page *page)
> {
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index a63733dac659e..9311d1f3793ad 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -6381,15 +6381,34 @@ void adjust_managed_page_count(struct page *page, long count)
> }
> EXPORT_SYMBOL(adjust_managed_page_count);
>
> -void free_reserved_page(struct page *page)
> +/**
> + * free_reserved_pages - free reserved pages
> + * @page: First page to free.
> + * @order: The page order to free.
> + *
> + * Free pages allocated through memblock during boot, letting the buddy
> + * manage them from now on.
> + *
> + * @page must be naturally aligned to the order and the order must not
> + * exceed MAX_PAGE_ORDER. All pages must be reserved.
> + */
> +void free_reserved_pages(struct page *page, unsigned int order)
> {
> - clear_page_tag_ref(page);
> - ClearPageReserved(page);
> - init_page_count(page);
> - __free_page(page);
> - adjust_managed_page_count(page, 1);
> + const unsigned long nr_pages = 1UL << order;
> + int i;
> +
> + VM_WARN_ON_ONCE(!IS_ALIGNED(page_to_pfn(page), nr_pages));
> + VM_WARN_ON_ONCE(order > MAX_PAGE_ORDER);
> +
> + for (i = 0; i < nr_pages; i++) {
> + clear_page_tag_ref(page + i);
> + ClearPageReserved(page + i);
> + set_page_count(page + i, 0);
Sashiko raises in reply to #4 that PFN walkers trying to grab pages could see
their reference getting overridden.
While that is not something we should be worrying about (or fixing in old code),
I think it's best to ClearPageReserved() after set_page_count(), so someone
actually trying to grab a reference would have the chance to rely on
PageReserved from being a reliable indication.
--
Cheers,
David
next prev parent reply other threads:[~2026-07-08 15:13 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-08 14:10 [PATCH 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
2026-07-08 14:10 ` [PATCH 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
2026-07-08 14:22 ` sashiko-bot
2026-07-08 15:15 ` David Hildenbrand (Arm)
2026-07-09 2:32 ` Muchun Song
2026-07-08 14:10 ` [PATCH 02/10] mm: provide free_reserved_pages(), removing x86 variant David Hildenbrand (Arm)
2026-07-08 15:13 ` David Hildenbrand (Arm) [this message]
2026-07-09 6:19 ` Muchun Song
2026-07-08 14:10 ` [PATCH 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages() David Hildenbrand (Arm)
2026-07-09 6:12 ` Heiko Carstens
2026-07-09 6:21 ` Muchun Song
2026-07-08 14:10 ` [PATCH 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type David Hildenbrand (Arm)
2026-07-08 14:53 ` sashiko-bot
2026-07-09 6:23 ` Muchun Song
2026-07-08 14:11 ` [PATCH 05/10] x86/mm: stop marking vmemmap as SECTION_INFO David Hildenbrand (Arm)
2026-07-08 15:10 ` sashiko-bot
2026-07-08 15:20 ` David Hildenbrand (Arm)
2026-07-08 14:11 ` [PATCH 06/10] x86/mm: stop marking page tables as MIX_SECTION_INFO David Hildenbrand (Arm)
2026-07-08 15:24 ` sashiko-bot
2026-07-08 15:27 ` David Hildenbrand (Arm)
2026-07-08 14:11 ` [PATCH 07/10] x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
2026-07-08 15:38 ` sashiko-bot
2026-07-08 14:11 ` [PATCH 08/10] mm/hugetlb_vmemmap: remove bootmem_info leftovers David Hildenbrand (Arm)
2026-07-09 6:26 ` Muchun Song
2026-07-08 14:11 ` [PATCH 09/10] mm/sparse: remove bootmem_info.h include David Hildenbrand (Arm)
2026-07-09 6:26 ` Muchun Song
2026-07-08 14:11 ` [PATCH 10/10] mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
2026-07-09 6:27 ` Muchun Song
2026-07-08 21:24 ` [PATCH 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) Andrew Morton
2026-07-09 9:36 ` Mike Rapoport
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=dd1bfb6a-4e3d-40dc-b1b1-6c169279b366@kernel.org \
--to=david@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=borntraeger@linux.ibm.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hannes@cmpxchg.org \
--cc=hca@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=jackmanb@google.com \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-s390@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=luto@kernel.org \
--cc=mhocko@suse.com \
--cc=mingo@redhat.com \
--cc=muchun.song@linux.dev \
--cc=osalvador@suse.de \
--cc=peterz@infradead.org \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=svens@linux.ibm.com \
--cc=tglx@kernel.org \
--cc=vbabka@kernel.org \
--cc=x86@kernel.org \
--cc=ziy@nvidia.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.