From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta0.migadu.com (out-40.mta0.migadu.com [91.218.175.40]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AA2033FE09 for ; Fri, 14 Aug 2026 11:23:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.40 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786706590; cv=none; b=O4WJwHdSyJ1RzYswzqJib8hRGBjDvXNzp5iMXjnjE5V0sl7hzVVQ9Or/oi4kP7UhpEQNO2/V1Fw+qqhwmLULk1V2gk/GjGPqCx9mhJph6d9/nJTenR6zikqGBn3tLL7BwQrHGwEitEWIkxGAz5pA0w4zKWcHD6c3vpINdCSCRx4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786706590; c=relaxed/simple; bh=DviyH3BtVAYDhX5SLXkzdx0JgQCnoJdEeju32uvP3Y4=; h=Content-Type:Date:Message-Id:Cc:Subject:From:To:Mime-Version: References:In-Reply-To; b=CqC5DMnJs/+AQ4MztXzpx/q6eLoDIcXKQ1O3Yj/PkJJPCdLi0maZLaDiWh0hBMte0KIV7X4LeciyGNn0I1c45idntT0ZrimgX/R3GDM4498Ss6oKs70+gEHi0nv4P8ca5Ys2GOLV6YxlQiWd/zAQG8+bXs/feL+IbVkDJYl9vs8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=K0D51rqp; arc=none smtp.client-ip=91.218.175.40 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="K0D51rqp" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=DviyH3BtVAYDhX5SLXkzdx0JgQCnoJdEeju32uvP3Y4=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1786706582; v=1; x=1787311382; b=K0D51rqp455cXsxukZsP8zt+dFhP7OlD0BdU95+eCiElu/yXmBK+Ix9HbdKUUfusTiNHrQio wKXq2VlzeSGCXAQ7+FdFkyHHryeDOkXEaO5l8HImo+IAc2d0+wyQuUEU7ylylrJ09alb3tEmWPL +UFD0+Mrz013Pmi9g/TjZRzk= X-Envelope-To: linux-kernel@vger.kernel.org Received: from localhost (77.97.51.77) by smtp.migadu.com with ESMTPS id e64bb87d811e3f35; Fri, 14 Aug 2026 11:22:52 +0000 X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset=UTF-8 Date: Fri, 14 Aug 2026 12:22:46 +0100 Message-Id: Cc: "Borislav Petkov" , "Dave Hansen" , "Peter Zijlstra" , "Andrew Morton" , "David Hildenbrand" , "Vlastimil Babka" , "Mike Rapoport" , "Wei Xu" , "Johannes Weiner" , "Zi Yan" , "Lorenzo Stoakes" , , , , "Sumit Garg" , "Will Deacon" , , "Kalyazin, Nikita" , , "Itazuri, Takahiro" , "Andy Lutomirski" , "David Kaplan" , "Thomas Gleixner" , "Patrick Bellasi" , "Reiji Watanabe" , "Sean Christopherson" Subject: Re: [PATCH v3 16/26] mm: add definitions for allocating unmapped pages From: "Brendan Jackman" To: "Yosry Ahmed" , "Brendan Jackman" Content-Transfer-Encoding: quoted-printable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: aerc 0.21.0 References: <20260726-page_alloc-unmapped-v3-0-6f5729aa9832@google.com> <20260726-page_alloc-unmapped-v3-16-6f5729aa9832@google.com> In-Reply-To: On Tue Aug 4, 2026 at 8:53 PM BST, Yosry Ahmed wrote: > On Sun, Jul 26, 2026 at 10:22:49PM +0000, Brendan Jackman wrote: >> 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. >>=20 >> 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. >>=20 >> Also create the corresponding pageblock flag to record the same thing. >>=20 >> To keep patches from being too overwhelming, the actual implementation >> is added separately, this is just types, Kconfig boilerplate, etc. >>=20 >> Acked-by: Vlastimil Babka (SUSE) >> Signed-off-by: Brendan Jackman >> --- >> include/linux/freetype.h | 70 ++++++++++++++++++++++++++++++++++++++++-= ------- >> mm/Kconfig | 3 +++ >> mm/page_alloc.h | 18 +++++++++++++ >> 3 files changed, 80 insertions(+), 11 deletions(-) >>=20 >> 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 >> =20 >> +#include >> #include >> #include >> =20 >> @@ -64,20 +65,47 @@ static inline bool migratetype_is_mergeable(int mt) >> return mt < MIGRATE_PCPTYPES; >> } >> =20 >> +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 me= mory. >> */ >> typedef struct { >> - int migratetype; >> + unsigned int migratetype : order_base_2(MIGRATE_TYPES); >> + unsigned int flags : NUM_FREETYPE_FLAGS; >> } freetype_t; >> =20 >> +#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 fre= e 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 we move this to the beginning of the function we can drop the > VM_WARN_ON_ONCE() below, right? This one says "assert no flags are set that are incompatible with FREETYPE_UNMAPPED", the one below says "assert no completely invalid freetype flags are set". Right now those are the same thing so we _could_ combine them, but just happenstance. >> + if (freetype.migratetype !=3D MIGRATE_UNMOVABLE) >> + return -1; >> + return MIGRATE_TYPES; >> + } >> + /* No other flags are supported. */ >> + VM_WARN_ON_ONCE(freetype.flags); >> + >> return freetype.migratetype; >> } >> =20 >> @@ -85,33 +113,53 @@ static inline freetype_t freetype_from_idx(unsigned= int idx) >> { >> freetype_t freetype; >> =20 >> - freetype.migratetype =3D idx; > > Do we need a comment here? Something like this maybe: > > /* > * There is one freetype per migratetype, as well as one extra > * free type for unmovable unmapped pages. > */ > >> + if (idx =3D=3D MIGRATE_TYPES) { Well we have basically that exact comment on the definition of NR_FREETYPE_IDXS. Do you think we should move it here? > >> + freetype.flags =3D FREETYPE_UNMAPPED; >> + freetype.migratetype =3D MIGRATE_UNMOVABLE; >> + } else { >> + VM_WARN_ON_ONCE(idx < 0 || idx > MIGRATE_TYPES); >> + freetype.flags =3D 0; >> + freetype.migratetype =3D idx; >> + } >> return freetype; >> } > [..] >> 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 befor= e freeing >> + * the page. (This is true regardless of ALLOC_UNMAPPED). >> + * >> + * This uses the mermap (when __GFP_ZERO), so it's only valid to alloca= te 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 allo= cator >> + * leaves behind stale TLB entries in the mermap region. The caller is >> + * responsible for ensuring they are flushed as needed. > > I think this is no longer true as the allocator does not use the mermap > with __GFP_ZERO anymore? Oops, yep thanks. >> + * >> + * This is currently incompatible with __GFP_MOVABLE and __GFP_RECLAIMA= BLE, but >> + * only because of allocator implementation details, if a usecase arise= s this >> + * restriction could be dropped. > > It would help to explain why it's incompatible with __GFP_MOVABLE and > __GFP_RECLAIMABLE, here or in the changelog. I assume mainly because we > only have one freetype for unmapped unmovable, but there are also some > more interesting details like compaction needing to support copying > unmapped pages (e.g. via the mermap)? Yeah the latter is the reason I had in mind (also not just copying them when they're unmapped but also being aware of when it needs to "promote" a compaction to generate an entire block).=20 And yeah it makes sense to have that in a comment. This is a kinda "API comment" so spiritually it doesn't really belong here but I'd probably put it here anyway in parans just coz that's where it will actually be seen...