From nobody Sat Apr 4 06:09:09 2026 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (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 E962B3ECBDD for ; Fri, 20 Mar 2026 18:24:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774031042; cv=none; b=X8WbhJQnVyxHTcEafazhUJ9GCSa0joa+rIVDIGILVN7dqA3uaaoigXgBPwdvM7bPU9W7MJf+N4l9r4NGODwNJKXF0hQdwtu14MoDI2XIKHigznW+hTmST1YqVmP8A+AhzCVbI+4Ajbh5nDHSyA4qfj/LZDOlGE3wLyBZw+FTNm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774031042; c=relaxed/simple; bh=hsuCkj7wSuWYnlKIk0A1sB+IsnPqM5AtVqF7gWvLgK4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NMaBvNLyhhuOn0tzIW3rQxEA7oFtcf5NgLh8Hn3fd/K3f6EX+YESZ5nHMpApQA9MSE4cmuRFYx+21trWAPO0i+7C1HArmKQhq4cHm+HGWOcXl5+jtpFCulVs/BYTW0xIqDlB4ajLgvPMMcfCV7N34MTnHmvIEQWUBxIuFPvDiFY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jackmanb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=iZVKOCyp; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--jackmanb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="iZVKOCyp" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4837b6f6b93so6327685e9.3 for ; Fri, 20 Mar 2026 11:24:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774031039; x=1774635839; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=yCYW2ni6m62XGMoe5pWNGbD93sifZ1F5uJs6ndkREVw=; b=iZVKOCypvtrPm7ZgmdOLt835ssOUy07k19yJPj17hcPbI2sz00LYu1ZWVxnhJe5jK5 yD2Yj8gP9u3pKJJgNJ+d/ixyspDXT5uREgPEAKSjPpnxv+ssB7pIelDojMomrRQ3KNOd gehjXEfrjEmrF2iUQRwQHtykoLkAO/sSn8wW1Kd4sMesXRFZibJefZX2HZmowjAei8to TwslLQdmobIE3JJtQgGz1DUcalk3mZw/ixYF0iEE8TQE1aB7gaVATIdgNuwxERj+zCTF 7JSlw+NUUEGM0tnAF35GxSAqY5erzVQP83ZO0izoTK0RY6jIxxcDL0vqevgbergemIvM u96g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774031039; x=1774635839; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=yCYW2ni6m62XGMoe5pWNGbD93sifZ1F5uJs6ndkREVw=; b=BCZWWAaK5ZD9YSkZvbXwav0wNNK2ogJeIfEzSc0uIrBXTfBom1D0mPY9Zgop8ywPvv oleQz5hwnS5oYBC64+pFgNo8316ySu7OPSH1FCLxm6FVlTxjAnKaU2dOY7rsvCYWDsAf zOFX7ategtAldjOZ8l4Yxd2bksFo3Cbf+NUGQ44RseNtbiD2Ovrq7WHbC7Jg/cqwhHWv dCjBXrVwZRWbmZv6U0cI+l07vbhnKysz4Iad1HOfL5bekLCLrea/+IXd4wJUlUzzoyPM hGW0NOHLAmEo7t/E3Q5pZLhDKSswsM+8Mu6NhWNznwm3bU4lRXiwql52zd9phmLjkKt0 oddA== X-Forwarded-Encrypted: i=1; AJvYcCVQsV+Vh6yZ6JO3Dx+KP4EMIoVMOfJ1Rfcrp71WJq4uPbYcQBIRkgAOYt7DX2r6rTTvPWDwP9en3cahqF0=@vger.kernel.org X-Gm-Message-State: AOJu0YxWGJU9KtDeE6Butt4nVohcuh9+CR4qa3KD8GqLyqPv8ynb/rVW p/2XCzc2zD/ItoYQTQ09QKq/+dmp+63iYMApO9dcfpiSpV4HOnbDFMKSLwsaWYjdk0dK1B6A+zn +Th48+50M/1rUAw== X-Received: from wmbhi3.prod.google.com ([2002:a05:600c:5343:b0:47f:941a:613d]) (user=jackmanb job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:c84:b0:480:1c69:9d36 with SMTP id 5b1f17b1804b1-486fee0d808mr59836105e9.17.1774031039185; Fri, 20 Mar 2026 11:23:59 -0700 (PDT) Date: Fri, 20 Mar 2026 18:23:38 +0000 In-Reply-To: <20260320-page_alloc-unmapped-v2-0-28bf1bd54f41@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260320-page_alloc-unmapped-v2-0-28bf1bd54f41@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260320-page_alloc-unmapped-v2-14-28bf1bd54f41@google.com> Subject: [PATCH v2 14/22] mm: encode freetype flags in pageblock flags From: Brendan Jackman To: Borislav Petkov , Dave Hansen , Peter Zijlstra , Andrew Morton , David Hildenbrand , Vlastimil Babka , Wei Xu , Johannes Weiner , Zi Yan , Lorenzo Stoakes Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, x86@kernel.org, rppt@kernel.org, Sumit Garg , derkling@google.com, reijiw@google.com, Will Deacon , rientjes@google.com, "Kalyazin, Nikita" , patrick.roy@linux.dev, "Itazuri, Takahiro" , Andy Lutomirski , David Kaplan , Thomas Gleixner , Brendan Jackman , Yosry Ahmed Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable In preparation for implementing allocation from FREETYPE_UNMAPPED lists. Since it works nicely with the existing allocator logic, and also offers a simple way to amortize TLB flushing costs, __GFP_UNMAPPED will be implemented by changing mappings at pageblock granularity. Therefore, encode the mapping state in the pageblock flags. Also add the necessary logic to record this from a freetype, and reconstruct a freetype from the pageblock flags. Signed-off-by: Brendan Jackman --- include/linux/pageblock-flags.h | 10 ++++++++++ mm/page_alloc.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flag= s.h index 9a6c3ea17684d..b634280050071 100644 --- a/include/linux/pageblock-flags.h +++ b/include/linux/pageblock-flags.h @@ -11,6 +11,8 @@ #ifndef PAGEBLOCK_FLAGS_H #define PAGEBLOCK_FLAGS_H =20 +#include +#include #include =20 /* Bit indices that affect a whole block of pages */ @@ -18,6 +20,9 @@ enum pageblock_bits { PB_migrate_0, PB_migrate_1, PB_migrate_2, + PB_freetype_flags, + PB_freetype_flags_end =3D PB_freetype_flags + NUM_FREETYPE_FLAGS - 1, + PB_compact_skip,/* If set the block is skipped by compaction */ =20 #ifdef CONFIG_MEMORY_ISOLATION @@ -37,6 +42,7 @@ enum pageblock_bits { #define NR_PAGEBLOCK_BITS (roundup_pow_of_two(__NR_PAGEBLOCK_BITS)) =20 #define PAGEBLOCK_MIGRATETYPE_MASK (BIT(PB_migrate_0)|BIT(PB_migrate_1)|BI= T(PB_migrate_2)) +#define PAGEBLOCK_FREETYPE_FLAGS_MASK (((1 << NUM_FREETYPE_FLAGS) - 1) << = PB_freetype_flags) =20 #ifdef CONFIG_MEMORY_ISOLATION #define PAGEBLOCK_ISO_MASK BIT(PB_migrate_isolate) @@ -44,6 +50,10 @@ enum pageblock_bits { #define PAGEBLOCK_ISO_MASK 0 #endif =20 +#define PAGEBLOCK_FREETYPE_MASK (PAGEBLOCK_MIGRATETYPE_MASK | \ + PAGEBLOCK_ISO_MASK | \ + PAGEBLOCK_FREETYPE_FLAGS_MASK) + #if defined(CONFIG_HUGETLB_PAGE) =20 #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d16f7b7bdf282..994ddcb132aed 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -357,11 +357,8 @@ get_pfnblock_bitmap_bitidx(const struct page *page, un= signed long pfn, unsigned long *bitmap; unsigned long word_bitidx; =20 -#ifdef CONFIG_MEMORY_ISOLATION - BUILD_BUG_ON(NR_PAGEBLOCK_BITS !=3D 8); -#else - BUILD_BUG_ON(NR_PAGEBLOCK_BITS !=3D 4); -#endif + /* NR_PAGEBLOCK_BITS must divide word size. */ + BUILD_BUG_ON(NR_PAGEBLOCK_BITS !=3D 4 && NR_PAGEBLOCK_BITS !=3D 8); BUILD_BUG_ON(__MIGRATE_TYPE_END > PAGEBLOCK_MIGRATETYPE_MASK); VM_BUG_ON_PAGE(!zone_spans_pfn(page_zone(page), pfn), page); =20 @@ -434,9 +431,20 @@ __always_inline freetype_t __get_pfnblock_freetype(const struct page *page, unsigned long pfn, bool ignore_iso) { - int mt =3D get_pfnblock_migratetype(page, pfn); + unsigned long mask =3D PAGEBLOCK_FREETYPE_MASK; + enum migratetype migratetype; + unsigned int ft_flags; + unsigned long flags; =20 - return migrate_to_freetype(mt, 0); + flags =3D __get_pfnblock_flags_mask(page, pfn, mask); + ft_flags =3D (flags & PAGEBLOCK_FREETYPE_FLAGS_MASK) >> PB_freetype_flags; + + migratetype =3D flags & PAGEBLOCK_MIGRATETYPE_MASK; +#ifdef CONFIG_MEMORY_ISOLATION + if (!ignore_iso && flags & BIT(PB_migrate_isolate)) + migratetype =3D MIGRATE_ISOLATE; +#endif + return migrate_to_freetype(migratetype, ft_flags); } =20 /** @@ -570,6 +578,15 @@ static void set_pageblock_migratetype(struct page *pag= e, PAGEBLOCK_MIGRATETYPE_MASK | PAGEBLOCK_ISO_MASK); } =20 +static inline void set_pageblock_freetype_flags(struct page *page, + unsigned int ft_flags) +{ + unsigned int flags =3D ft_flags << PB_freetype_flags; + + __set_pfnblock_flags_mask(page, page_to_pfn(page), flags, + PAGEBLOCK_FREETYPE_FLAGS_MASK); +} + void __meminit init_pageblock_migratetype(struct page *page, enum migratetype migratetype, bool isolate) @@ -593,7 +610,7 @@ void __meminit init_pageblock_migratetype(struct page *= page, flags |=3D BIT(PB_migrate_isolate); #endif __set_pfnblock_flags_mask(page, page_to_pfn(page), flags, - PAGEBLOCK_MIGRATETYPE_MASK | PAGEBLOCK_ISO_MASK); + PAGEBLOCK_FREETYPE_MASK); } =20 #ifdef CONFIG_DEBUG_VM --=20 2.51.2