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 16/26] mm: add definitions for allocating unmapped pages
Date: Sun, 26 Jul 2026 22:22:49 +0000 [thread overview]
Message-ID: <20260726-page_alloc-unmapped-v3-16-6f5729aa9832@google.com> (raw)
In-Reply-To: <20260726-page_alloc-unmapped-v3-0-6f5729aa9832@google.com>
Create ALLOC_UNMAPPED, which requests pages that are not present in the
direct map. Since this feature has a cost (e.g. more freelists), it's
behind a kconfig. Unlike other conditionally-defined alloc flags, it
doesn't fall back to being 0. This prevents building code that uses
ALLOC_UNMAPPED but doesn't depend on the necessary kconfig, since that
would lead to invisible security issues.
Create a freetype flag to record that pages on the freelists with this
flag are unmapped. This is currently only needed for MIGRATE_UNMOVABLE
pages, so the freetype encoding remains trivial.
Also create the corresponding pageblock flag to record the same thing.
To keep patches from being too overwhelming, the actual implementation
is added separately, this is just types, Kconfig boilerplate, etc.
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
include/linux/freetype.h | 70 ++++++++++++++++++++++++++++++++++++++++--------
mm/Kconfig | 3 +++
mm/page_alloc.h | 18 +++++++++++++
3 files changed, 80 insertions(+), 11 deletions(-)
diff --git a/include/linux/freetype.h b/include/linux/freetype.h
index 3b0d44023b6a1..37e88dcccdecc 100644
--- a/include/linux/freetype.h
+++ b/include/linux/freetype.h
@@ -2,6 +2,7 @@
#ifndef _LINUX_FREETYPE_H
#define _LINUX_FREETYPE_H
+#include <linux/log2.h>
#include <linux/types.h>
#include <linux/mmdebug.h>
@@ -64,20 +65,47 @@ static inline bool migratetype_is_mergeable(int mt)
return mt < MIGRATE_PCPTYPES;
}
+enum {
+ /* Defined unconditionally as a hack to avoid a zero-width bitfield. */
+ FREETYPE_UNMAPPED_BIT,
+ NUM_FREETYPE_FLAGS,
+};
+
/*
* A freetype is the identifier for a page freelist. This consists of a
* migratetype, and other bits which encode orthogonal properties of memory.
*/
typedef struct {
- int migratetype;
+ unsigned int migratetype : order_base_2(MIGRATE_TYPES);
+ unsigned int flags : NUM_FREETYPE_FLAGS;
} freetype_t;
+#ifdef CONFIG_PAGE_ALLOC_UNMAPPED
+#define FREETYPE_UNMAPPED BIT(FREETYPE_UNMAPPED_BIT)
+#define NUM_UNMAPPED_FREETYPES 1
+#else
+#define FREETYPE_UNMAPPED 0
+#define NUM_UNMAPPED_FREETYPES 0
+#endif
+
+#define FREETYPE_FLAGS_MASK FREETYPE_UNMAPPED
+
/*
* 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)
{
+ /* For FREETYPE_UNMAPPED, only MIGRATE_UNMOVABLE has an index. */
+ if (freetype.flags & FREETYPE_UNMAPPED) {
+ VM_WARN_ON_ONCE(freetype.flags & ~FREETYPE_UNMAPPED);
+ if (freetype.migratetype != MIGRATE_UNMOVABLE)
+ return -1;
+ return MIGRATE_TYPES;
+ }
+ /* No other flags are supported. */
+ VM_WARN_ON_ONCE(freetype.flags);
+
return freetype.migratetype;
}
@@ -85,33 +113,53 @@ static inline freetype_t freetype_from_idx(unsigned int idx)
{
freetype_t freetype;
- freetype.migratetype = idx;
+ if (idx == MIGRATE_TYPES) {
+ freetype.flags = FREETYPE_UNMAPPED;
+ freetype.migratetype = MIGRATE_UNMOVABLE;
+ } else {
+ VM_WARN_ON_ONCE(idx < 0 || idx > MIGRATE_TYPES);
+ freetype.flags = 0;
+ freetype.migratetype = idx;
+ }
return freetype;
}
-/* No freetype flags actually exist yet. */
-#define NR_FREETYPE_IDXS MIGRATE_TYPES
+/* One for each migratetype, plus one for MIGRATE_UNMOVABLE-FREETYPE_UNMAPPED */
+#define NR_FREETYPE_IDXS (MIGRATE_TYPES + NUM_UNMAPPED_FREETYPES)
static inline unsigned int freetype_flags(freetype_t freetype)
{
- /* No flags supported yet. */
- return 0;
+ return freetype.flags;
}
+#ifdef CONFIG_PAGE_ALLOC_UNMAPPED
+static inline bool freetype_unmapped(freetype_t freetype)
+{
+ return !!(freetype.flags & FREETYPE_UNMAPPED);
+}
+#else
+static inline bool freetype_unmapped(freetype_t freetype)
+{
+ return false;
+}
+#endif
+
static inline bool freetypes_equal(freetype_t a, freetype_t b)
{
- return a.migratetype == b.migratetype;
+ return a.migratetype == b.migratetype && a.flags == b.flags;
}
static inline freetype_t migrate_to_freetype(enum migratetype mt,
unsigned int flags)
{
- freetype_t freetype;
+ freetype_t freetype = {
+ .migratetype = mt,
+ .flags = flags,
+ };
- /* No flags supported yet. */
- VM_WARN_ON_ONCE(flags);
+ VM_WARN_ON_ONCE(flags & ~FREETYPE_FLAGS_MASK);
+ VM_WARN_ON_ONCE(mt >= MIGRATE_TYPES);
- freetype.migratetype = mt;
return freetype;
}
diff --git a/mm/Kconfig b/mm/Kconfig
index adf71788971a2..aa5f041ce1a67 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -1530,3 +1530,6 @@ config MERMAP_KUNIT_TEST
source "mm/damon/Kconfig"
endmenu
+
+config PAGE_ALLOC_UNMAPPED
+ bool
diff --git a/mm/page_alloc.h b/mm/page_alloc.h
index 9928aa9012588..fac8e5304bb03 100644
--- a/mm/page_alloc.h
+++ b/mm/page_alloc.h
@@ -56,6 +56,24 @@
* alloc_tag_sub_check().
*/
#define ALLOC_NO_CODETAG 0x1000
+#ifdef CONFIG_PAGE_ALLOC_UNMAPPED
+/*
+ * Allocate pages that aren't present in the direct map. If the caller changes
+ * direct map presence, it must be restored to the previous state before freeing
+ * the page. (This is true regardless of ALLOC_UNMAPPED).
+ *
+ * This uses the mermap (when __GFP_ZERO), so it's only valid to allocate with
+ * this flag where that's valid, namely from process context after the mermap
+ * has been initialised for that process. This also means that the allocator
+ * leaves behind stale TLB entries in the mermap region. The caller is
+ * responsible for ensuring they are flushed as needed.
+ *
+ * This is currently incompatible with __GFP_MOVABLE and __GFP_RECLAIMABLE, but
+ * only because of allocator implementation details, if a usecase arises this
+ * restriction could be dropped.
+ */
+#define ALLOC_UNMAPPED 0x2000
+#endif
/* Flags that allow allocations below the min watermark. */
#define ALLOC_RESERVES (ALLOC_NON_BLOCK|ALLOC_MIN_RESERVE|ALLOC_HIGHATOMIC|ALLOC_OOM)
--
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 ` [PATCH v3 15/26] mm/page_alloc: add support for freetypes with no freelist Brendan Jackman
2026-07-31 14:13 ` Vlastimil Babka (SUSE)
2026-07-26 22:22 ` Brendan Jackman [this message]
2026-08-04 19:53 ` [PATCH v3 16/26] mm: add definitions for allocating unmapped pages 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-16-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®