From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.221.71 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794395305; b=VPZgxkQQNJq1N/l4rROvZvUNEmQQBcTRpzEvk5XsvWJK6JhUaeSJcmNkOHgLptRJ6sOw +r9JxvJpiI7aKwNLYPX18qXc9YiI5hYRvEiAc4lPzH70sTCKk86Xzsj+G8q8YK2bN1hav nEiRGnC8A+MdJiICsEm0zqkWZc+eEx2vn1ZhXnw+w1yQyb6G4CvF1/XlGusu2gevkch0l oj1+xwZQpL/domU/QvDoOm2hoNFkk4Kp52b/A/ZHyuelDX/TtktCSBvxsoSgy4Or4RrUz nYX6TQQT/RXJi+C7YMAYqDDck49aRzNEWMK5DlgocODEVhta7qZCJMKsdVb+j9B9SCQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794395305; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Received:Date:In-Reply-To: Mime-Version:References:X-Mailer:Message-ID:Subject:From:To:Cc: Content-Type; bh=Wg+r/G4UynsyjzcD9VFm7KNuI6HhIxNTVl9eF5+p1ZQ=; b=CvKGkQWQ7RBWvx05tLmx9aF72wspX8dELrcxXCMfTpKYPrRRdHc7x0fYgKNwc/jfJM/l oaZN8BQSRrl0S85eto1lwiOiOCyh6l4V4a2oeDQKhN8+mc3kFbpnBvC/sX9tfJLNFtc42 xigyXyCXOmyplRk4NzbKhkHR5lo4u28c56Ur4Nc4Wy5NYP7tQA4p0ofvbm3CQoSZQBA4G zvzN5dVRbUeIPg+yZu1MABhd2PaIFBUcmd07Lnd6FyKo2EChelZ1cJaS86jnPI4XUuNpi opwgbNR1/+QWNnQ3oO4E8JhsV0rNKNMTB2lJUlHmk5ex3n6KcppcXqnLFmsahXE53Mg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20260707 header.b="Fy/7BKBF"; arc=none smtp.remote-ip=209.85.221.71 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C35F60A2611 for ; Wed, 11 Nov 2026 11:08:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 4C35F60A2611 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--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20260707 header.b=Fy/7BKBF Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-48c6a1d4034so2250069f8f.0 for ; Wed, 11 Nov 2026 03:08:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20260707; t=1794395304; x=1795000104; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Wg+r/G4UynsyjzcD9VFm7KNuI6HhIxNTVl9eF5+p1ZQ=; b=Fy/7BKBFYE9wdynicU8BcEzaUnjiStNn6F1hi1bSjkCZrRFyhcsxjltjfO/zaRJCO2 TkcMPXROApQYDHuE7/H7iwfTPKCn+suiyC1nod7huQOJxjtiiMN+0tc3w2l5yk0jmCJZ KVOGgVbXvgeJ1Y0yuHMJmlB4DGHLsiSczyGDHR/CB+nIY/KFaw1IhcSDaWF29q6lVPuC +15QNL00w3ICJusi5CSQf7NcDbY6tNOiqJ9mkcMr3nPU2WYdXDoDcWZuiyaPH1SbmznM QAo1ycqGcGKGceg3FomBIw1dvJst8fyj9noRTSDy8G7We9xaz69o46NTizwljMiLfmVZ vd+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794395304; x=1795000104; h=content-type: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:content-type; bh=Wg+r/G4UynsyjzcD9VFm7KNuI6HhIxNTVl9eF5+p1ZQ=; b=QsmzsvItxrAT5N0e2Em8pyNoB0uNnUInHFDh+h4MXU6MLQLBzG8vrmz9MuboJ1skFT m0AFsJat4v6mze5E4JJ5NfuL3kT4kUQdhz1BIuYoV0SIWSAvhxsHsrSbdTK8G8ih8Tac PKTC44K5PJHR4jaCfUMgaplsba8H9aqSjrKkgG8Eb061agIstsMpFcDkey0HqDWdkqhU X/RtVn+Jy6Ki3gZQlor/xRPdEfNVaCMvEogflPt1QEeeprM3AqU7J8dnIxwcVSB0u2Ea y3lzitemfVugXbOTR7WrKTSClZm/ncBJoNydaxCCkVmcVKl8SknfxtPcMUzWQ5fkGuLs AE6g== X-Forwarded-Encrypted: i=1; AL+hErHx3Fxj+EsflnZRUh0EfnfdbakS8Ikx6IxUFu2wzg9lPPFULf1uVQ8rn0VJpRo/AwW5zOykJi8ujwuE@vger.kernel.org X-Gm-Message-State: APuU4Z93pR6LEVTUMGp/vsw8LIKY3/xmSZV9pMuilNkFUiJcbgtKTscq 0+WgwLMnYladZvti7cTguWhaoZLbsfN44qGGhjUH+uG5QIl8b1QICgKQSm94nvEu6AF9lG6+VHV HrYSiNqwmXQxasMGecumbWQ== X-Received: from wmo18.prod.google.com ([2002:a05:600c:2312:b0:4a5:34a9:6903]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600d:82f1:b0:4a2:cbe:beac with SMTP id 5b1f17b1804b1-4ba093c85ebmr40371365e9.23.1794395303273; Wed, 11 Nov 2026 03:08:23 -0800 (PST) Date: Wed, 11 Nov 2026 11:07:31 +0000 In-Reply-To: <20261111110738.872947-1-vdonnefort@google.com> X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Mime-Version: 1.0 References: <20261111110738.872947-1-vdonnefort@google.com> X-Mailer: git-send-email 2.56.0.542.g3ef89b7020-goog Message-ID: <20261111110738.872947-2-vdonnefort@google.com> Subject: [PATCH v3 1/8] memblock: Introduce MEMBLOCK_PTEMAP From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, m.szyprowski@samsung.com, jenswi@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: mark.rutland@arm.com, robin.murphy@arm.com, hch@lst.de, ryan.roberts@arm.com, sumit.garg@kernel.org, sudeep.holla@kernel.org, ardb@kernel.org, thierry.reding@kernel.org, david@kernel.org, danielmentz@google.com, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, iommu@lists.linux.dev, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Type: text/plain; charset="UTF-8" Keeping PTE-level mappings is interesting for arm64 as it allows mapping/unmapping pages from the kernel direct map without the risk of splitting blocks which, under the break-before-make rule, may trigger page-faults the kernel can't handle. However, mapping the entire direct map at PTE-level is costly. So instead, create a new memblock flag MEMBLOCK_PTEMAP to selectively apply a PTE-level mapping. Signed-off-by: Vincent Donnefort --- include/linux/memblock.h | 9 +++++++++ mm/memblock.c | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 40e6e0aa2f8d..67ef20a1c5e2 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -52,6 +52,7 @@ extern unsigned long long max_possible_pfn; * know is good to use. It is the only memory that allocations may happen from * in this phase. * @MEMBLOCK_RSRV_HUGETLB: memory is reserved for hugetlb pages + * @MEMBLOCK_PTEMAP: memory region to be mapped using PTE-level mapping */ enum memblock_flags { MEMBLOCK_NONE = 0x0, /* No special request */ @@ -63,6 +64,7 @@ enum memblock_flags { MEMBLOCK_RSRV_KERN = 0x20, /* memory reserved for kernel use */ MEMBLOCK_KHO_NOPRSRV = 0x40, /* memory with no KHO preservations */ MEMBLOCK_RSRV_HUGETLB = 0x80, /* memory reserved for hugetlb pages */ + MEMBLOCK_PTEMAP = 0x100,/* PTE-level mapping */ }; /** @@ -160,6 +162,8 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t size); int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size); int memblock_mark_kho_noprsrv(phys_addr_t base, phys_addr_t size); int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size); +int memblock_mark_ptemap(phys_addr_t base, phys_addr_t size); +int memblock_clear_ptemap(phys_addr_t base, phys_addr_t size); void memblock_free(void *ptr, size_t size); @@ -305,6 +309,11 @@ static inline bool memblock_is_kho_noprsrv(struct memblock_region *m) return m->flags & MEMBLOCK_KHO_NOPRSRV; } +static inline bool memblock_is_ptemap(struct memblock_region *m) +{ + return m->flags & MEMBLOCK_PTEMAP; +} + int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn, unsigned long *end_pfn); void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn, diff --git a/mm/memblock.c b/mm/memblock.c index a450092a80fb..b8b6e762917a 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1068,10 +1068,15 @@ static int __init_memblock memblock_setclr_flag(struct memblock_type *type, for (i = start_rgn; i < end_rgn; i++) { struct memblock_region *r = &type->regions[i]; - if (set) + if (set) { + enum memblock_flags map_flags = + MEMBLOCK_NOMAP | MEMBLOCK_PTEMAP; + r->flags |= flag; - else + WARN_ON_ONCE((r->flags & map_flags) == map_flags); + } else { r->flags &= ~flag; + } } memblock_merge_regions(type, start_rgn, end_rgn); @@ -1221,6 +1226,35 @@ __init int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size) MEMBLOCK_KHO_NOPRSRV); } +/** + * memblock_mark_ptemap - Mark a memory region with flag MEMBLOCK_PTEMAP. + * @base: the base phys addr of the region + * @size: the size of the region + * + * If supported by the architecture, such region is mapped using PTE-level + * mappings in the kernel direct map. + * + * Return: 0 on success, -errno on failure. + */ +int __init_memblock memblock_mark_ptemap(phys_addr_t base, phys_addr_t size) +{ + return memblock_setclr_flag(&memblock.memory, base, size, 1, + MEMBLOCK_PTEMAP); +} + +/** + * memblock_clear_ptemap - Clear flag MEMBLOCK_PTEMAP for a specified region. + * @base: the base phys addr of the region + * @size: the size of the region + * + * Return: 0 on success, -errno on failure. + */ +int __init_memblock memblock_clear_ptemap(phys_addr_t base, phys_addr_t size) +{ + return memblock_setclr_flag(&memblock.memory, base, size, 0, + MEMBLOCK_PTEMAP); +} + static bool should_skip_region(struct memblock_type *type, struct memblock_region *m, int nid, int flags) @@ -2854,6 +2888,7 @@ static const char * const flagname[] = { [ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN", [ilog2(MEMBLOCK_KHO_NOPRSRV)] = "KHO_NOPRSRV", [ilog2(MEMBLOCK_RSRV_HUGETLB)] = "RSV_HUGETLB", + [ilog2(MEMBLOCK_PTEMAP)] = "PTEMAP", }; static int memblock_debug_show(struct seq_file *m, void *private) -- 2.56.0.542.g3ef89b7020-goog