From: Brendan Jackman <jackmanb@google.com>
To: Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>, Wei Xu <weixugc@google.com>,
Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
Lorenzo Stoakes <ljs@kernel.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, x86@kernel.org,
rppt@kernel.org, Sumit Garg <sumit.garg@oss.qualcomm.com>,
Will Deacon <will@kernel.org>,
rientjes@google.com, "Kalyazin, Nikita" <kalyazin@amazon.co.uk>,
patrick.roy@linux.dev, "Itazuri, Takahiro" <itazur@amazon.co.uk>,
Andy Lutomirski <luto@kernel.org>,
David Kaplan <david.kaplan@amd.com>,
Thomas Gleixner <tglx@kernel.org>, Yosry Ahmed <yosry@kernel.org>,
Patrick Bellasi <derkling@google.com>,
Reiji Watanabe <reijiw@google.com>,
Sean Christopherson <seanjc@google.com>,
Brendan Jackman <jackmanb@google.com>
Subject: [PATCH v3 15/26] mm/page_alloc: add support for freetypes with no freelist
Date: Sun, 26 Jul 2026 22:22:48 +0000 [thread overview]
Message-ID: <20260726-page_alloc-unmapped-v3-15-6f5729aa9832@google.com> (raw)
In-Reply-To: <20260726-page_alloc-unmapped-v3-0-6f5729aa9832@google.com>
Freetypes are currently just a wrapper for migratetypes, but in a later
patch they will gain flags. The theoretically possible space of
freetypes will thus grow, but many freetypes will not actually be used
in practice.
To avoid bloating structures that contain arrays of freelists, mark
freetype_idx() as possibly returning -1, and add handling of this case
to code paths that will look up freelists by freetype (unless those
paths "know" that they're operating on a freetype that has a
valid freetype_idx).
It never actually returns -1 yet, this is just introduced as a separate
patch to make review easier.
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
include/linux/freetype.h | 3 ++-
mm/page_alloc.c | 13 +++++++++++--
mm/page_isolation.c | 6 ++++++
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/include/linux/freetype.h b/include/linux/freetype.h
index b16dcd58e184c..3b0d44023b6a1 100644
--- a/include/linux/freetype.h
+++ b/include/linux/freetype.h
@@ -73,7 +73,8 @@ typedef struct {
} freetype_t;
/*
- * Return a dense linear index for freetypes.
+ * Return a dense linear index for freetypes that have lists in the free area.
+ * Return -1 for other freetypes.
*/
static inline int freetype_idx(freetype_t freetype)
{
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 60aedd0e78b54..4965019dc2286 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1963,6 +1963,9 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
struct free_area *area;
struct page *page;
+ if (freetype_idx(freetype) < 0)
+ return NULL;
+
/* Find a page of the appropriate size in the preferred list */
for (current_order = order; current_order < NR_PAGE_ORDERS; ++current_order) {
enum migratetype migratetype = free_to_migratetype(freetype);
@@ -2406,6 +2409,9 @@ find_suitable_fallback(struct free_area *area, unsigned int order,
*/
freetype_t fallback_ft = freetype_with_migrate(freetype, fallback_mt);
+ if (freetype_idx(fallback_ft) < 0)
+ continue;
+
if (!free_area_empty(area, fallback_ft)) {
if (ft_out)
*ft_out = fallback_ft;
@@ -3642,6 +3648,8 @@ static void reserve_highatomic_pageblock(struct page *page, int order,
static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
bool force)
{
+ freetype_t ft_high = freetype_with_migrate(ac->freetype,
+ MIGRATE_HIGHATOMIC);
struct zonelist *zonelist = ac->zonelist;
struct zoneref *z;
struct zone *zone;
@@ -3649,6 +3657,9 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
int order;
int ret;
+ if (freetype_idx(ft_high) < 0)
+ return false;
+
for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->highest_zoneidx,
ac->nodemask) {
/*
@@ -3662,8 +3673,6 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
guard(spinlock_irqsave)(&zone->lock);
for (order = 0; order < NR_PAGE_ORDERS; order++) {
struct free_area *area = &(zone->free_area[order]);
- freetype_t ft_high = freetype_with_migrate(ac->freetype,
- MIGRATE_HIGHATOMIC);
unsigned long size;
page = get_page_from_free_area(area, ft_high);
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index f81186431d3c3..e6bd227fbf1db 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -176,6 +176,7 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
struct zone *zone = page_zone(page);
struct page *unmovable;
unsigned long check_unmovable_start, check_unmovable_end;
+ freetype_t ft_isolate;
if (PageUnaccepted(page))
accept_page(page);
@@ -189,6 +190,11 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
if (is_migrate_isolate_page(page))
return -EBUSY;
+ /* Do not isolate unsupported freetypes. */
+ ft_isolate = freetype_with_migrate(get_pageblock_freetype(page), MIGRATE_ISOLATE);
+ if (freetype_idx(ft_isolate) < 0)
+ return -EINVAL;
+
/*
* FIXME: Now, memory hotplug doesn't call shrink_slab() by
* itself. We just check MOVABLE pages.
--
2.54.0
next prev parent reply other threads:[~2026-07-26 22:23 UTC|newest]
Thread overview: 119+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-26 22:22 [PATCH v3 00/26] mm: Add ALLOC_UNMAPPED and AS_NO_DIRECT_MAP Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 01/26] set_memory: add folio_{zap,restore}_direct_map helpers Brendan Jackman
2026-07-27 10:33 ` Mike Rapoport
2026-07-29 11:42 ` Brendan Jackman
2026-07-30 20:34 ` Yosry Ahmed
2026-07-31 5:21 ` Mike Rapoport
2026-07-31 11:57 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 02/26] mm/secretmem: make use of folio_{zap,restore}_direct_map Brendan Jackman
2026-07-27 10:40 ` Mike Rapoport
2026-07-26 22:22 ` [PATCH v3 03/26] mm: introduce AS_NO_DIRECT_MAP Brendan Jackman
2026-07-30 21:06 ` Yosry Ahmed
2026-07-31 12:15 ` Brendan Jackman
2026-07-31 19:28 ` Yosry Ahmed
2026-08-07 0:02 ` Sean Christopherson
2026-08-07 0:13 ` Yosry Ahmed
2026-08-07 0:19 ` Sean Christopherson
2026-08-07 0:29 ` Yosry Ahmed
2026-08-07 14:26 ` Sean Christopherson
2026-08-07 18:12 ` Yosry Ahmed
2026-08-07 18:49 ` Sean Christopherson
2026-08-07 19:39 ` Yosry Ahmed
2026-08-07 22:44 ` Sean Christopherson
2026-08-07 22:48 ` Yosry Ahmed
2026-09-03 7:26 ` Takahiro Itazuri
2026-09-03 14:06 ` Yosry Ahmed
2026-09-03 14:25 ` Takahiro Itazuri
2026-09-15 16:01 ` Gregory Price
2026-08-08 13:56 ` Brendan Jackman
2026-08-10 21:39 ` Yosry Ahmed
2026-08-10 21:46 ` Sean Christopherson
2026-08-13 15:32 ` Brendan Jackman
2026-08-13 17:25 ` Ackerley Tng
2026-08-18 0:32 ` Yosry Ahmed
2026-08-18 10:41 ` Brendan Jackman
2026-08-02 16:10 ` Mike Rapoport
2026-08-08 0:19 ` Yosry Ahmed
2026-07-26 22:22 ` [PATCH v3 04/26] x86/mm: split out preallocate_sub_pgd() Brendan Jackman
2026-07-31 22:10 ` Yosry Ahmed
2026-08-13 15:42 ` Brendan Jackman
2026-08-18 0:30 ` Yosry Ahmed
2026-08-02 16:13 ` Mike Rapoport
2026-08-13 15:46 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 05/26] x86: move PAE PMD preallocation defines to header Brendan Jackman
2026-07-31 23:59 ` Yosry Ahmed
2026-08-13 15:49 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 06/26] x86/tlb: Expose some flush function declarations to modules Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 07/26] x86/mm: introduce mm-local region Brendan Jackman
2026-08-02 16:27 ` Mike Rapoport
2026-08-13 16:10 ` Brendan Jackman
2026-08-03 22:29 ` Yosry Ahmed
2026-08-13 16:23 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 08/26] x86/mm: move LDT remap into " Brendan Jackman
2026-08-03 22:33 ` Yosry Ahmed
2026-07-26 22:22 ` [PATCH v3 09/26] mm: Create flags arg for __apply_to_page_range() Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 10/26] mm: Add more flags " Brendan Jackman
2026-08-04 0:08 ` Yosry Ahmed
2026-08-13 16:40 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 11/26] x86/mm: introduce the mermap Brendan Jackman
2026-08-02 16:40 ` Mike Rapoport
2026-08-13 16:44 ` Brendan Jackman
2026-08-04 18:38 ` Yosry Ahmed
2026-07-26 22:22 ` [PATCH v3 12/26] mm: KUnit tests for " Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 13/26] mm: introduce freetype_t Brendan Jackman
2026-08-04 22:23 ` Yosry Ahmed
2026-08-14 10:37 ` Brendan Jackman
2026-08-18 0:35 ` Yosry Ahmed
2026-09-03 8:00 ` Vlastimil Babka (SUSE)
2026-09-03 13:30 ` Yosry Ahmed
2026-08-04 23:02 ` Yosry Ahmed
2026-08-14 10:48 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 14/26] mm: move migratetype definitions to freetype.h Brendan Jackman
2026-07-26 22:22 ` Brendan Jackman [this message]
2026-07-31 14:13 ` [PATCH v3 15/26] mm/page_alloc: add support for freetypes with no freelist Vlastimil Babka (SUSE)
2026-07-26 22:22 ` [PATCH v3 16/26] mm: add definitions for allocating unmapped pages Brendan Jackman
2026-08-04 19:53 ` Yosry Ahmed
2026-08-14 11:22 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 17/26] mm: encode freetype flags in pageblock flags Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 18/26] mm/page_alloc: separate pcplists by freetype flags Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 19/26] mm/page_alloc: rename ALLOC_NON_BLOCK back to _HARDER Brendan Jackman
2026-07-31 14:52 ` Vlastimil Babka (SUSE)
2026-08-03 9:20 ` Vlastimil Babka (SUSE)
2026-08-04 21:50 ` Yosry Ahmed
2026-08-14 12:09 ` Brendan Jackman
2026-08-18 0:45 ` Yosry Ahmed
2026-08-18 10:58 ` Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 20/26] mm/page_alloc: introduce ALLOC_NOBLOCK Brendan Jackman
2026-07-26 22:22 ` [PATCH v3 21/26] mm/page_alloc: implement FREETYPE_UNMAPPED allocations Brendan Jackman
2026-08-03 9:18 ` Vlastimil Babka (SUSE)
2026-08-15 14:12 ` Brendan Jackman
2026-08-04 23:41 ` Yosry Ahmed
2026-08-07 0:05 ` Yosry Ahmed
2026-08-14 12:31 ` Brendan Jackman
2026-08-04 23:53 ` Yosry Ahmed
2026-08-05 16:13 ` Yosry Ahmed
2026-08-15 14:28 ` Brendan Jackman
2026-08-18 0:55 ` Yosry Ahmed
2026-08-18 11:03 ` Brendan Jackman
2026-08-18 17:51 ` Yosry Ahmed
2026-08-25 20:01 ` Yosry Ahmed
2026-08-07 0:16 ` Yosry Ahmed
2026-08-15 14:30 ` Brendan Jackman
2026-08-18 0:50 ` Yosry Ahmed
2026-08-12 21:26 ` Yosry Ahmed
2026-08-15 14:43 ` Brendan Jackman
2026-08-18 0:49 ` Yosry Ahmed
2026-08-18 1:01 ` Yosry Ahmed
2026-07-26 22:22 ` [PATCH v3 22/26] mm: Minimal KUnit tests for some new page_alloc logic Brendan Jackman
2026-08-03 9:30 ` Vlastimil Babka (SUSE)
2026-07-26 22:22 ` [PATCH v3 23/26] mm: Split out NR_FREE_PAGES_BLOCKS_[UN]MAPPED Brendan Jackman
2026-08-03 9:32 ` Vlastimil Babka (SUSE)
2026-07-26 22:22 ` [PATCH v3 24/26] mm/page_alloc: always direct compact for unmapped allocs Brendan Jackman
2026-08-03 9:44 ` Vlastimil Babka (SUSE)
2026-08-15 14:44 ` Brendan Jackman
2026-08-06 23:29 ` Yosry Ahmed
2026-07-26 22:22 ` [PATCH v3 25/26] mm: plumb alloc flags into some alloc funcs Brendan Jackman
2026-08-03 9:52 ` Vlastimil Babka (SUSE)
2026-07-26 22:22 ` [PATCH v3 26/26] mm: add fast path for AS_NO_DIRECT_MAP Brendan Jackman
2026-08-08 0:06 ` Yosry Ahmed
2026-07-29 11:52 ` [PATCH v3 00/26] mm: Add ALLOC_UNMAPPED and AS_NO_DIRECT_MAP Brendan Jackman
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=20260726-page_alloc-unmapped-v3-15-6f5729aa9832@google.com \
--to=jackmanb@google.com \
--cc=akpm@linux-foundation.org \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=david.kaplan@amd.com \
--cc=david@kernel.org \
--cc=derkling@google.com \
--cc=hannes@cmpxchg.org \
--cc=itazur@amazon.co.uk \
--cc=kalyazin@amazon.co.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=luto@kernel.org \
--cc=patrick.roy@linux.dev \
--cc=peterz@infradead.org \
--cc=reijiw@google.com \
--cc=rientjes@google.com \
--cc=rppt@kernel.org \
--cc=seanjc@google.com \
--cc=sumit.garg@oss.qualcomm.com \
--cc=tglx@kernel.org \
--cc=vbabka@kernel.org \
--cc=weixugc@google.com \
--cc=will@kernel.org \
--cc=x86@kernel.org \
--cc=yosry@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®