From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.128.70 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794395305; b=QRVal2NbCGdChTCFqRLnYpHYsR0clIzt9RziUJXDq7SifCj3acdw6Dl3u4jzIGE1nvkc vIY5KiRdiJWpAwosNid14U0h1ZiVtSJLZvShqwsQ+YR20k+GW/l5KhExChzcIYfkbUp6Z tce3husODIpQAJv46ZWSh0bDZzmOMRoG9wNExad1HHY7rk0xweUR1MHIAne3r3lIgDjMR 1ncUyXlm4kk1K8YzduOU+TK9QxpXCAsebUHCDatzTfe5ZGgtMHtXw6Ahokm2YE0WTBK09 G/k9S8TgzdqWTc0dsQn2MHjAUppdtuSWlxM2lQ5Xrc6t102ri9oQTPqrAK3XZUZDb7Q== 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=mNU7mk7i7bV9zK7vmpUI4DTJDtpo4J+xvcOBpHEfOpQU/hDkCKzvmjFmtUcFgp4/jqGy 2vRcidEYgm79CBvIa2DDv5xzsdUuH9CX72P/5qKFKHl4WHEbfbp9WzWBIH1qL2RteuvIV nnAVxCRei8bqZ5AsPpQUHA7j8rlRYuM8IG5XVCeHbPrHOC6ty6J4Vx4s/0KjhO486TD66 JCBD6ogcrbtY9OSpeCOJT6yVeb6uuVEkpvvB3a5vtC9pzSeWJxcyM2wACpNAwRPpEIG57 cdVwt7ThJA+j00XAI7q7I5VvBxVxFSzidV/fI7EEBtpWHmMyY8w8HXs7bxFVkMFnQyQ== 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.128.70 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (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 3C66B60A2617 for ; Wed, 11 Nov 2026 11:08:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 3C66B60A2617 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-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4b9f7cace4bso28426735e9.3 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=Zq5DH42OsQ+4dm/OtU0AqswlMZ5O6bSpmPiZpNijtI9onLn0YJDfDIJvbBMl1q+pTV LayOWvl2D+iTfmLXmdm10pG7YR1rL5efQRM/jzWDnL5WSM59d1hyxWxS6LCnIcF7r0C2 Aa098LDgs3+S7GMQJvuczfTi3X/5+FmZ8sAy7Yz6n/hpHEllqLqn1X9zbjvPbuw3rOPb FsZ/54HeQnQcAy2lCJTLbM6ORPfTIzqPUXcMxoqC6TjhSCSwLXqosOK8jUukBv4HXYM5 YpjvPu/D6hArMY24dD54OrYblb33xLI3KtAPx7A3dBI4D/ydHB067zJjua1+HkD5kQTn gvrQ== X-Forwarded-Encrypted: i=1; AL+hErGJSq6c2y2KBanU+mcOxizp+Ad9wddRd5ZKpFVaLgHJYbocGDaznZQNWWXw29kBoQH21r6FgV+tNgIjqnQ=@vger.kernel.org X-Gm-Message-State: APuU4Z8tNzjAGWz1NfSkWWoMbgD1cAEFY5cCmv5Zn62G+4JOPltlIlwi tZ5lYT3IWKLwJuYArSaAX0BSHUSW/y63v40HRqbOHt46iLJ6A26UdfCoqqyFmsihH6qIQShUk8I PB8O06mBYgby6g1JoTWbtcQ== 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: linux-kernel@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