From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (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 BFA5743F8AE for ; Wed, 2 Sep 2026 10:51:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346276; cv=none; b=g6XL9/+1XCwU4/Gwv8KupMKtABAuYaCI5IyhvbDekziZNlTdSlFe82h8juI1JRKH2IM0GcABBh9+BiPG9qj8wBqoGWUqx8Y7S5/4hSEbLYeHD4IRQ3iJQFhu40ek2fYLGyK8OQqMLioA7h/oRgVPLwicNEs81/mVvcYxDUIBAeg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346276; c=relaxed/simple; bh=6vwnExrPXeu4OT1kol2nQNcoEOHFQGpvOL1iKrPK/c0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YVaaRJvdssJ3XT5Bo6JZjvVPQFf+aYp/K3onHAE076RWMRDlefWKR+eNW4+ccUe03sMTL235jMIeTLsdPg8pGj9Ay61WmvAWlnLXxWJQD/8k63pgcJdCNkllyTy9JcFAEZDEZQcexw/jThVvclp5F3oBdIwqroPWf/UF7e6/n0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vUUdfQ+t; arc=none smtp.client-ip=209.85.128.70 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.b="vUUdfQ+t" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-495689bfcc8so6363425e9.1 for ; Wed, 02 Sep 2026 03:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346268; x=1788951068; 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=tkcdapIGW4RxTiLPx+DO8uuzWqNmooyhO69bXNbCQ5o=; b=vUUdfQ+t/XRC+5rAU86ZtFi3AwfxZkiEfN+Jqui1cFCHVGIkz2dTLAlO8hXMBEHMID Ve05YgI9BK2qk7mXAOyEJ2ndmrqZ7nT5rIyo/2kuhM3YZEku8j0D9IJGG4fFwwKLHqpR M9nyFlbaNrwldCaIHLHYXHgZQaGBaFI9R7QD0Ae9oqAXJB5eusSxO3TQ1zm7LEjNxPvD VF7PslZGjOgU89tpYErObGxXkRkrvJzcP2rAVe8R0B2mecFvf9y35nGIRkfRNbGCojs4 ZAQCemS1HmYHVNTKASFfzKbce29RDIsWLQ0auaSoAJKpEJ5VaQk0GVOkJFRSbFuePwpe /14g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346268; x=1788951068; 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=tkcdapIGW4RxTiLPx+DO8uuzWqNmooyhO69bXNbCQ5o=; b=JLU0qdqp6ICLwKMTFWez68WJtJgOqtdid/BSxrYgRTPl/qUBuPF/d8cnPAiScCUecA 3cx3lbfHe2MxqSTiR3SPpflWxiR791OxHjJ+6pRYiGEVtT1/WpgIp0z3kvqLSeAP8wtj LlbdhrIqXxKYq/DlfyGTAdi7hMlnQ95wbOa+8SknSClmRUMxQoORWugWp4a1tXEuSBPX nCbX/S9ZHsq6qmOm5IpxuoxfNDQ8jbB2UJkJNi7NnvYS6PvBJtt2DXc2P5JgWuwxmbOp 2EvFTSRCls7LuKrt3hg98YNFTFoYuNq/QitE75S82m8/sXnMVc5lwKhxpAqyn+6NRGm8 n8gQ== X-Forwarded-Encrypted: i=1; AHgh+RotSx7uQhmvw5nhj0D9qKvLh5KSB4qqJNwhFP0LBCw/w58vX+u7hL/fejelmK5h/gAv/VH5xNWVGnkOldg=@vger.kernel.org X-Gm-Message-State: AFuF++k6rZ6fQrqeuQXM9WCDQ7s1KzWv11d20kovM66SclrfSJaEhg+E rm9y5y5KntjOzEx5hOt+2/N4xsp4WzhLZpiyW8hsZwNOxrb1Kooyc1iVYVVRJXA1RIg1Zatz+8I chkM5ymi8OBy6J3x3OCRdPg== X-Received: from wmph35.prod.google.com ([2002:a05:600c:49a3:b0:499:b2be:d4b]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:c4a6:b0:498:952:e276 with SMTP id 5b1f17b1804b1-49ce581142cmr69791455e9.8.1788346267736; Wed, 02 Sep 2026 03:51:07 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:03 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-2-vdonnefort@google.com> Subject: [PATCH v9 01/10] memblock: Introduce MEMBLOCK_LLMAP From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Keeping last-level mappings is interesting on some architectures 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_LLMAP to enable the system to decide which region must be covered by mappings up to the last-level. Signed-off-by: Vincent Donnefort diff --git a/include/linux/memblock.h b/include/linux/memblock.h index d62db9e776cf..d40a5ded188d 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -52,6 +52,7 @@ extern unsigned long long max_possible_pfn; * kernel that we 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_LLMAP: memory region to be mapped using last-level mapping */ enum memblock_flags { MEMBLOCK_NONE =3D 0x0, /* No special request */ @@ -63,6 +64,7 @@ enum memblock_flags { MEMBLOCK_RSRV_KERN =3D 0x20, /* memory reserved for kernel use */ MEMBLOCK_KHO_SCRATCH =3D 0x40, /* scratch memory for kexec handover */ MEMBLOCK_RSRV_HUGETLB =3D 0x80, /* memory reserved for hugetlb pages */ + MEMBLOCK_LLMAP =3D 0x100,/* last-level mapping */ }; =20 /** @@ -160,6 +162,8 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phy= s_addr_t size); int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size); int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size); int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size); +int memblock_mark_llmap(phys_addr_t base, phys_addr_t size); +int memblock_clear_llmap(phys_addr_t base, phys_addr_t size); =20 void memblock_free(void *ptr, size_t size); void reset_all_zones_managed_pages(void); @@ -306,6 +310,11 @@ static inline bool memblock_is_kho_scratch(struct memb= lock_region *m) return m->flags & MEMBLOCK_KHO_SCRATCH; } =20 +static inline bool memblock_is_llmap(struct memblock_region *m) +{ + return m->flags & MEMBLOCK_LLMAP; +} + 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 9ce86349a29f..1591b50503ed 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1119,6 +1119,16 @@ int __init_memblock memblock_mark_mirror(phys_addr_t= base, phys_addr_t size) */ int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size) { + struct memblock_region *r; + + memblock_cap_size(base, &size); + + for_each_mem_region(r) { + if (memblock_is_llmap(r) && + memblock_addrs_overlap(base, size, r->base, r->size)) + return -EINVAL; + } + return memblock_setclr_flag(&memblock.memory, base, size, 1, MEMBLOCK_NOM= AP); } =20 @@ -1204,6 +1214,45 @@ __init int memblock_clear_kho_scratch(phys_addr_t ba= se, phys_addr_t size) MEMBLOCK_KHO_SCRATCH); } =20 +/** + * memblock_mark_llmap - Mark a memory region with flag MEMBLOCK_LLMAP. + * @base: the base phys addr of the region + * @size: the size of the region + * + * If supported by the architecture, such region is mapped at the last-lev= el in + * the kernel direct map. + * + * Return: 0 on success, -errno on failure. + */ +int __init_memblock memblock_mark_llmap(phys_addr_t base, phys_addr_t size) +{ + struct memblock_region *r; + + memblock_cap_size(base, &size); + + for_each_mem_region(r) { + if (memblock_is_nomap(r) && + memblock_addrs_overlap(base, size, r->base, r->size)) + return -EINVAL; + } + + return memblock_setclr_flag(&memblock.memory, base, size, 1, + MEMBLOCK_LLMAP); +} + +/** + * memblock_clear_llmap - Clear flag MEMBLOCK_LLMAP 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_llmap(phys_addr_t base, phys_addr_t siz= e) +{ + return memblock_setclr_flag(&memblock.memory, base, size, 0, + MEMBLOCK_LLMAP); +} + static bool should_skip_region(struct memblock_type *type, struct memblock_region *m, int nid, int flags) @@ -2886,6 +2935,7 @@ static const char * const flagname[] =3D { [ilog2(MEMBLOCK_RSRV_NOINIT)] =3D "RSV_NIT", [ilog2(MEMBLOCK_RSRV_KERN)] =3D "RSV_KERN", [ilog2(MEMBLOCK_KHO_SCRATCH)] =3D "KHO_SCRATCH", + [ilog2(MEMBLOCK_LLMAP)] =3D "LLMAP", }; =20 static int memblock_debug_show(struct seq_file *m, void *private) --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) (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 69AD747124D for ; Wed, 2 Sep 2026 10:51:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346277; cv=none; b=Ucr5sHO9uLLpVJy2+nRH5iDuGfWvVsgDSLnvP+CKius0uKWkI1Wn1M/1ILbMWS+yZA5yHMUr6RmqbigRpOxBoTRVAl6mwB8aexE6Y1bRc0QYMTQ7raXM1zEXXSgmGYe8EY6oyE5nuyWhVXmRLFq3KfAFTvgvE/3yTxjFcljPI14= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346277; c=relaxed/simple; bh=RsJ6maEfydlgRHfAusJRbg3oK58wmuxDifTUT74arNQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=izryInRKey3SuMgiG4K7hms2Xw1Ttro9Rq0rRUnUD+iYUNYnjOLtWNb1gPx5rlVANOw9+ijBOS1yeJXjlUCQMazD2v6gPGErlHQppxQQEECFND2Yxqmdp+RZ/+9BxCjU+647XKv1z+JRUQW9O1+9U1Hp8XnreYjIAfS4wqy172Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YytXuuVz; arc=none smtp.client-ip=209.85.128.71 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.b="YytXuuVz" Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-490a767c7dcso6863285e9.2 for ; Wed, 02 Sep 2026 03:51:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346269; x=1788951069; 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=BmhXowTIOzHcHY7UkEdd72g+gSt6KBOTf5gqmJgT9x4=; b=YytXuuVziL+PgbE2xunilYshc8QWVoLyX51Dc+CpUaKrrwmAxrrtyg5uPxFKBydlMw 3tCy5vj+h2u6O148WeXj6xP9OEsxXqZEZXy/WSXS28uJ7JdFm09Ugu29jtiEgxGupyOb qdDnnBeYdkv+cb4FKyygA7BUFIdoW9kdrBkMYO1Trdud0woMoQyfgLmvIHY7+V4JJsTq GyeZIGSPeZ+B47KP8lZyfBp9pJVUy3SX3pKF0TxEeOcGieoddk86LASccQyqYMEr0xOG h7+9O6CAF0uEW0Bxj48B8hjEQG/jGFwx2sKOr7yh8IvhMADr/G0d9Snlvl96BJBV1aXX AL2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346269; x=1788951069; 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=BmhXowTIOzHcHY7UkEdd72g+gSt6KBOTf5gqmJgT9x4=; b=ZudTsoKzjBfii7v3zbX+3gbOx60dZkBU1kmtuA4qdMP2RS/ISUwd1XtDDLhH1AB9uq F+0NIPWaOhG2I1J15Mcm4mKm7a54oZ60/VHn8iDhmZQ6lwOHICo6wX2jABwWdmYog+q9 f3OMWSGZwtJXpjGA+2PtPc8FuGVROQPBWAvF3E9Whfuu+CZpYtoA4xo4fJ6Xi6nsabhy kPHVF65URsM20juXx0uYS91YRZnIgtTYyuGezLq+qLEekUhxZHQOBEdAQOrWGpzy1DSd 0BSG+waV6rdDoF1y9uCijM3NpnQqaGNuLYD97tOKY0bnisJJ1HVi5x6JuaoFEZfyBR3H x6aQ== X-Forwarded-Encrypted: i=1; AHgh+Rpxa5HFjJke6tH3JvhYsV7ookkpR/FahJABvE2Jlzed3OIZzQ7pZFJZQzWfaahxr5jsYYVe1cAmqd9u0s4=@vger.kernel.org X-Gm-Message-State: AFuF++ndVLhE+RyGqBu3sx1YTc4Dh8kDhVAXP4Cmd1F9HW1qgDZHNL5m /DgyFA5EZ0BLlKOWMd2r3ELG9gfVwyOTineQEU4dwMS5IjuO1dPm5Hs1+TBCrAXn6Lsptu8J91Q yj4w1YfHtcUFc5WTXfuNO2A== X-Received: from wmbgx10.prod.google.com ([2002:a05:600c:858a:b0:49b:96b9:9d0f]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b18:b0:49c:d26a:cf70 with SMTP id 5b1f17b1804b1-49ce583adbemr59327195e9.15.1788346269076; Wed, 02 Sep 2026 03:51:09 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:04 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-3-vdonnefort@google.com> Subject: [PATCH v9 02/10] of: reserved_mem: Introduce "ll-map" property From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Keeping last-level mappings is interesting on some architectures 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. Add an "ll-map" property for reserved-memory regions. When set, it splits the underlying memblock and sets the MEMBLOCK_LLMAP flag. Signed-off-by: Vincent Donnefort diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 8c9d6395d6a3..9ff2d02cb149 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -32,9 +32,32 @@ static struct reserved_mem *reserved_mem __refdata =3D r= eserved_mem_array; static int total_reserved_mem_cnt =3D MAX_RESERVED_REGIONS; static int reserved_mem_count; =20 +enum of_rmem_flags { + OF_RMEM_NONE =3D 0, + OF_RMEM_NOMAP =3D BIT(0), + OF_RMEM_LLMAP =3D BIT(1), +}; + +static int __init of_reserved_mem_flags(unsigned long node, enum of_rmem_f= lags *flags) +{ + *flags =3D OF_RMEM_NONE; + + if (of_get_flat_dt_prop(node, "no-map", NULL)) + *flags |=3D OF_RMEM_NOMAP; + if (of_get_flat_dt_prop(node, "ll-map", NULL)) + *flags |=3D OF_RMEM_LLMAP; + + if ((*flags & OF_RMEM_NOMAP) && (*flags & OF_RMEM_LLMAP)) { + pr_err("Reserved memory: no-map and ll-map are mutually exclusive\n"); + return -EINVAL; + } + + return 0; +} + static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t siz= e, - phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, - phys_addr_t *res_base) + phys_addr_t align, phys_addr_t start, phys_addr_t end, + enum of_rmem_flags flags, phys_addr_t *res_base) { phys_addr_t base; int err =3D 0; @@ -46,10 +69,21 @@ static int __init early_init_dt_alloc_reserved_memory_a= rch(phys_addr_t size, return -ENOMEM; =20 *res_base =3D base; - if (nomap) { - err =3D memblock_mark_nomap(base, size); - if (err) + if (flags & OF_RMEM_LLMAP) { + err =3D memblock_mark_llmap(base, size); + if (err) { memblock_phys_free(base, size); + return err; + } + } + + if (flags & OF_RMEM_NOMAP) { + err =3D memblock_mark_nomap(base, size); + if (err) { + if (flags & OF_RMEM_LLMAP) + memblock_clear_llmap(base, size); + memblock_phys_free(base, size); + } } =20 if (!err) @@ -119,17 +153,29 @@ static int fdt_fixup_reserved_mem_node(unsigned long = node, phys_addr_t base, phys_addr_t size); =20 static int __init early_init_dt_reserve_memory(phys_addr_t base, - phys_addr_t size, bool nomap) + phys_addr_t size, + enum of_rmem_flags flags) { - if (nomap) { + int err; + + if (flags & OF_RMEM_LLMAP) { + err =3D memblock_mark_llmap(base, size); + if (err) + return err; + } + + if (flags & OF_RMEM_NOMAP) { /* * If the memory is already reserved (by another region), we * should not allow it to be marked nomap, but don't worry * if the region isn't memory as it won't be mapped. */ if (memblock_overlaps_region(&memblock.memory, base, size) && - memblock_is_region_reserved(base, size)) + memblock_is_region_reserved(base, size)) { + if (flags & OF_RMEM_LLMAP) + memblock_clear_llmap(base, size); return -EBUSY; + } =20 return memblock_mark_nomap(base, size); } @@ -143,10 +189,10 @@ static int __init early_init_dt_reserve_memory(phys_a= ddr_t base, static int __init __reserved_mem_reserve_reg(unsigned long node, const char *uname) { + enum of_rmem_flags flags; phys_addr_t base, size; - int len, err; const __be32 *prop; - bool nomap; + int len, err; u64 b, s; =20 prop =3D of_flat_dt_get_addr_size_prop(node, "reg", &len); @@ -157,7 +203,9 @@ static int __init __reserved_mem_reserve_reg(unsigned l= ong node, pr_warn("Reserved memory: node '%s' has %d entries, only the= first is used\n", uname, len); =20 - nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; + err =3D of_reserved_mem_flags(node, &flags); + if (err) + return err; =20 err =3D fdt_validate_reserved_mem_node(node, NULL); if (err && err !=3D -ENODEV) @@ -167,7 +215,7 @@ static int __init __reserved_mem_reserve_reg(unsigned l= ong node, base =3D b; size =3D s; =20 - if (size && early_init_dt_reserve_memory(base, size, nomap) =3D=3D 0) { + if (size && early_init_dt_reserve_memory(base, size, flags) =3D=3D 0) { fdt_fixup_reserved_mem_node(node, base, size); pr_debug("Reserved memory: reserved region for node '%s': base %pa, size= %lu MiB\n", uname, &base, (unsigned long)(size / SZ_1M)); @@ -399,8 +447,8 @@ int __init fdt_scan_reserved_mem(void) * reserved regions to keep the reserved memory contiguous if possible. */ static int __init __reserved_mem_alloc_in_range(phys_addr_t size, - phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, - phys_addr_t *res_base) + phys_addr_t align, phys_addr_t start, phys_addr_t end, + enum of_rmem_flags flags, phys_addr_t *res_base) { bool prev_bottom_up =3D memblock_bottom_up(); bool bottom_up =3D false, top_down =3D false; @@ -435,7 +483,7 @@ static int __init __reserved_mem_alloc_in_range(phys_ad= dr_t size, memblock_set_bottom_up(bottom_up); =20 ret =3D early_init_dt_alloc_reserved_memory_arch(size, align, - start, end, nomap, res_base); + start, end, flags, res_base); =20 /* Restore old setting if needed */ if (bottom_up !=3D top_down) @@ -452,9 +500,9 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam { phys_addr_t start =3D 0, end =3D 0; phys_addr_t base =3D 0, align =3D 0, size; + enum of_rmem_flags flags; int i, len; const __be32 *prop; - bool nomap; int ret; =20 prop =3D of_get_flat_dt_prop(node, "size", &len); @@ -477,7 +525,9 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam align =3D dt_mem_next_cell(dt_root_addr_cells, &prop); } =20 - nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; + ret =3D of_reserved_mem_flags(node, &flags); + if (ret) + return ret; =20 ret =3D fdt_validate_reserved_mem_node(node, &align); if (ret && ret !=3D -ENODEV) @@ -495,7 +545,7 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam =20 base =3D 0; ret =3D __reserved_mem_alloc_in_range(size, align, - start, end, nomap, &base); + start, end, flags, &base); if (ret =3D=3D 0) { pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", uname, &base, @@ -505,7 +555,7 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam } } else { ret =3D early_init_dt_alloc_reserved_memory_arch(size, align, - 0, 0, nomap, &base); + 0, 0, flags, &base); if (ret =3D=3D 0) pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", uname, &base, (unsigned long)(size / SZ_1M)); @@ -635,8 +685,8 @@ static int __init __reserved_mem_init_node(struct reser= ved_mem *rmem, static void __init fdt_init_reserved_mem_node(unsigned long node, const ch= ar *uname, phys_addr_t base, phys_addr_t size) { + enum of_rmem_flags flags; int err =3D 0; - bool nomap; =20 struct reserved_mem *rmem =3D &reserved_mem[reserved_mem_count]; =20 @@ -650,14 +700,19 @@ static void __init fdt_init_reserved_mem_node(unsigne= d long node, const char *un rmem->base =3D base; rmem->size =3D size; =20 - nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; + err =3D of_reserved_mem_flags(node, &flags); + if (err) + return; =20 err =3D __reserved_mem_init_node(rmem, node); if (err !=3D 0 && err !=3D -ENODEV) { pr_info("node %s compatible matching fail\n", rmem->name); rmem->name =3D NULL; =20 - if (nomap) + if (flags & OF_RMEM_LLMAP) + memblock_clear_llmap(rmem->base, rmem->size); + + if (flags & OF_RMEM_NOMAP) memblock_clear_nomap(rmem->base, rmem->size); else memblock_phys_free(rmem->base, rmem->size); @@ -667,9 +722,10 @@ static void __init fdt_init_reserved_mem_node(unsigned= long node, const char *un bool reusable =3D (of_get_flat_dt_prop(node, "reusable", NULL)) !=3D NULL; =20 - pr_info("%pa..%pa (%lu KiB) %s %s %s\n", + pr_info("%pa..%pa (%lu KiB) %s %s %s %s\n", &rmem->base, &end, (unsigned long)(rmem->size / SZ_1K), - nomap ? "nomap" : "map", + (flags & OF_RMEM_LLMAP) ? "last-level " : "", + (flags & OF_RMEM_NOMAP) ? "nomap" : "map", reusable ? "reusable" : "non-reusable", rmem->name ? rmem->name : "unknown"); } --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) (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 0FAF247140F for ; Wed, 2 Sep 2026 10:51:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346297; cv=none; b=BFmp47CStCUECvpF9zC5pl+VbKPjPDlNi0zZvBJIpxZauHqvpR8QfP4gAFoy7Eu+VbfwJTErY+rXIBbKlRC0ktgCGd4apg1TujSzbYf4BuK3z7IanmYsOlbrStLnP1MwdSgFvZmGtBSj9qI+WC3GPmGHr3epgM/f1wY7+FxFgag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346297; c=relaxed/simple; bh=NRJjfa1oBWJjVwi9irw8swmUSNokXjGSiq7EU4Eu/kY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QOgHX1bSbJ1w9hVMBZEMi+oOmhuru+ZmE4jDeu1u5t9OBnT+oRl0BWIglD9BtyrsLKC7FOPqHqrmtqGyXEwqFqoM5rdeBMXSK7rxee6k024YvEByC5pDQTVqCfKLNASz2g0Y1oR1BuvbnJGc3O7piQpOgXTI6vkFqOlw3LMLN7M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cO7KfsSB; arc=none smtp.client-ip=209.85.218.71 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.b="cO7KfsSB" Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c217f249fa1so87663866b.0 for ; Wed, 02 Sep 2026 03:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346271; x=1788951071; 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=nz0QJrsFl6sXg/0SkB/zVAyOBBHBg8ebGgd7F8eNZsM=; b=cO7KfsSBhWdHUdklyHVOD8n38JwBqFaDAP4bFvmqCT02FYqDHQbd21SZuC+fR9k4ke ESqExeNF5vdjwoxAo/77kdmphTpAlvF6Jx5KnDU21W3ZWNJEtwwY3Z3lCQd4PAGznQbR wsVcX3DqMPThOg5XJNaskHeBI5yYOueLDKtoDLVOi8IUgpdfGPYyVuZHVAAKfYC1TkYM epye+3GTc9bFSNHkyvZC1qpGZa8IDHWrBTAkWavytV1TQdBGGnNypQlJ/nr3kQale66W eoPv7tZc2qDD1NYn/Mn3elZsMffypFBjb44jLK8MPaBtwWNZvJKgrrbgeyy5ppO7H8OQ Hu/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346271; x=1788951071; 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=nz0QJrsFl6sXg/0SkB/zVAyOBBHBg8ebGgd7F8eNZsM=; b=YiYojw+Jz+uk2fwTQcL0wkMggVYtmaRhald26x2XeLVn/g22TC8cwrw9fKUyS9v0y4 4mcIjqYt6M/fehtvj/3PQ63JsnujNaENDiiQgOrhO7OeEVpkFTx+T9YbhxaB2rJ6Yu0x WZAGoPK/vLQ4Av2LiFcHXEPOLIv6q+ml334T4KB5/SOFOENYOPHyj69hTcV5u/ARFLCv 8rRMCQ8B/k8jF9Tb9NhVrlc3btlDxnb1ZDudTtxPD78Q2X7EwW/To8cr3AWPsjy/2dtj zkuUqXbCAG44vocl1TRa2DaEZp9+3CXov2g7Cdt7vdPp/PSePM+wpQ4qQpPSJvl73Cyq PTVA== X-Forwarded-Encrypted: i=1; AKwUvBxv7x67Bb1JcgZEWY5eRrjK3G90uASDmbR5gQ+pgIiJdCErX3CpgyWwjnsSGxFOnzH8eKXtmINGX71UCqI=@vger.kernel.org X-Gm-Message-State: AFuF++l9x7zwQ92t3ODjvFUS8Mz4bFK4lY3hQ7eiSTb76cF2biZ4lipZ aXFRvK2QKBs/emvQGsFHY57jt+LmcMqwLrMQWb9m6tqT+Hi4gGdvVQs4jOIDpd0GuMeu/mXUq+k FjD7tk9j4A7s5NFQgxatdVw== X-Received: from ejcz24.prod.google.com ([2002:a17:906:2718:b0:c25:3006:b1a0]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a17:907:807:b0:c15:f598:60c0 with SMTP id a640c23a62f3a-c25d544f52fmr257827266b.4.1788346270231; Wed, 02 Sep 2026 03:51:10 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:05 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-4-vdonnefort@google.com> Subject: [PATCH v9 03/10] set_memory.h: Introduce can_set_direct_map_range() From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" While can_set_direct_map() tells whether the direct map can be modified globally, can_set_direct_map_range() checks if a specific range can be modified. e.g. if mapped at PTE-level. Signed-off-by: Vincent Donnefort diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h index 3030d9245f5a..88175c3fa751 100644 --- a/include/linux/set_memory.h +++ b/include/linux/set_memory.h @@ -44,6 +44,12 @@ static inline bool kernel_page_present(struct page *page) { return true; } + +static inline bool can_set_direct_map_range(struct page *page, + unsigned long nr_pages) +{ + return false; +} #else /* CONFIG_ARCH_HAS_SET_DIRECT_MAP */ /* * Some architectures, e.g. ARM64 can disable direct map modifications at @@ -56,6 +62,14 @@ static inline bool can_set_direct_map(void) } #define can_set_direct_map can_set_direct_map #endif + +#ifndef can_set_direct_map_range +static inline bool can_set_direct_map_range(struct page *page, unsigned lo= ng nr_pages) +{ + return can_set_direct_map(); +} +#define can_set_direct_map_range can_set_direct_map_range +#endif #endif /* CONFIG_ARCH_HAS_SET_DIRECT_MAP */ =20 #ifdef CONFIG_X86_64 --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) (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 1861846D570 for ; Wed, 2 Sep 2026 10:51:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346281; cv=none; b=pouaC9SUuS3g/NQOvKqq8SZY893KMVw09yWzzawuOTGRjRitjm99mOHQC/U5jtHgqtFMCVzrev1Sl3olXlb1W748cjbJJFgwaIdZkyXgCfXGNwCTAwbxwTRF3BNzQodagcKIQe0D1b03SNsjjD34CSrOneVVyQeDQpCv1qeapq4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346281; c=relaxed/simple; bh=Hjs9VwVCBCQIR9TgAq/HTqzG2ZG5eMRL2SHfgwqwO1k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=thq0mfFn4MLJiPHSH7ZRx29uZv3JLPy0oi+Fz794/c4xg9ZDZIxw5PGoim2n04TOsLsSvrIRyLGAtyjzoSQN6DTNQhVf8wuUXjHw9GaTK3EtHLM2MA366Egez6eibQRJE5oodfSkXA4Tk85EqUM2sOEYV+z5FVPVPEGa0YRXJOA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kiMguIVT; arc=none smtp.client-ip=209.85.128.69 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.b="kiMguIVT" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-49cd83ca361so10491115e9.1 for ; Wed, 02 Sep 2026 03:51:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346272; x=1788951072; 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=E9YJxK+goKseFQhyyU1kBZycBjFaImkJiX1HLmgsMgs=; b=kiMguIVT7KzOSC5cABj1WESBPpg0uMN4MhvNtNig7Fb9XE8B3ecCYb3o2QdVVPXKqG ROlh2StWi+idCLz9/0WmoQX4ydjGS//oNMlM91JijcdjvK0FkqPTOKiI9JDwf68RxuUU UhvVKyNiRnvDcIGAHgmF7rijYg8y0RwzvwUQT07P2383dCGQkyiMcTzXH0AnQubrAOpY BBTpVRatJz9umvvihCsfGbtY2BMkZ+jnDxBb+lTPK2Fa1rjvhpHFF3l9+FJNj04a+BS2 3efI9ttI3cKWZsO3duUXbFIoUejmdck5Z4DUmNqtT+GTzkINisn4QZX90LMeUl3EV1xq Ou0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346272; x=1788951072; 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=E9YJxK+goKseFQhyyU1kBZycBjFaImkJiX1HLmgsMgs=; b=mUjcsznAKRZtoOHwOvkIFhjbZfviEZ2rRwJPl7dJmSZY20hdUfmmxwVLXh7KQSLW3Q 3rDC2eSzJdXoEHx/Wcr84tcu4WTBc+rSVmxWiC9VP1GnW3KlkyGDdTMnIajaTXsDuh65 lbiy5DHRPTrDT+GMhl1e43pTenSkQteZ2pNKYcgAjpilLlDwdaErYPaDmxMZqNhcnYTP ABOJDBWdh5wZYsTP/25xnzV6IJjO9t/HTubXxtboUx6TSEvxaz66tMMQlSVate9laCae LSlhjOu/xuZGVhq7+FQtu98+Lqt2lMNGYVmAyzR+m0g8Q2CAEEquXTwSdm3VrVPziXlm e4+g== X-Forwarded-Encrypted: i=1; AHgh+Rp79oH9bynMXHyn4a7ihU6KhfTEXmzxENHwXLCmM4A+0shARtqAOopL4lwXZBfRWHSadDg0VqMfWxQ7glU=@vger.kernel.org X-Gm-Message-State: AFuF++kRsXhV42MnjUGIDMb19GNRlG+q1VWmfW1plWICndz2En8T1Crz Z9AIHZnopTG7kbe9dTnL9kGj8I5cUTuV349g0AuravCffNdTFwvCcF1daFOaWZAyFWwEKsOxbFx ARz2dDjRJRRTY7ck2fl8vSQ== X-Received: from wmik9.prod.google.com ([2002:a7b:c409:0:b0:49b:e83:a666]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e44:b0:49c:dcf8:5216 with SMTP id 5b1f17b1804b1-49ce57e7f55mr71897835e9.6.1788346271508; Wed, 02 Sep 2026 03:51:11 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:06 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-5-vdonnefort@google.com> Subject: [PATCH v9 04/10] set_memory.h: Introduce __set_direct_map*() From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" set_direct_map_*() implementations verify wheter the direct map can be effectively set. This verification can be costly. Add an "advanced" API __set_direct_map_*() where the direct map is modified without any check. The caller must have verified it is safe earlier with one of the can_set_direct_map() or can_set_direct_map_range() functions. Signed-off-by: Vincent Donnefort diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h index 88175c3fa751..5a1917a3fd52 100644 --- a/include/linux/set_memory.h +++ b/include/linux/set_memory.h @@ -34,6 +34,15 @@ static inline int set_direct_map_default_noflush(struct = page *page) return 0; } =20 +static inline int __set_direct_map_invalid_noflush(struct page *page) +{ + return 0; +} +static inline int __set_direct_map_default_noflush(struct page *page) +{ + return 0; +} + static inline int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) { @@ -70,6 +79,22 @@ static inline bool can_set_direct_map_range(struct page = *page, unsigned long nr_ } #define can_set_direct_map_range can_set_direct_map_range #endif + +#ifndef __set_direct_map_invalid_noflush +static inline int __set_direct_map_invalid_noflush(struct page *page) +{ + return set_direct_map_invalid_noflush(page); +} +#define __set_direct_map_invalid_noflush __set_direct_map_invalid_noflush +#endif + +#ifndef __set_direct_map_default_noflush +static inline int __set_direct_map_default_noflush(struct page *page) +{ + return set_direct_map_default_noflush(page); +} +#define __set_direct_map_default_noflush __set_direct_map_default_noflush +#endif #endif /* CONFIG_ARCH_HAS_SET_DIRECT_MAP */ =20 #ifdef CONFIG_X86_64 --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) (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 419E1472083 for ; Wed, 2 Sep 2026 10:51:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346284; cv=none; b=q2Anw/pHyN6jskdTEDnJqRKHfuGOqamZnG00Q2Fizrjq2V5o2+FTn3Xnqy1TH4xmSVPKy4u4VRUoIRyVtkI3Cjs13MWDLa9+DyCaq071XAiyTD00ER31+4419zWdKR6u11UbRL94SAmYkFNVOrvAyeXY171vmwVAV3dUIm96yLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346284; c=relaxed/simple; bh=5C0s/9UucVAGmXDEl+xwewW/gLO4zg1pKiD4RPTspKs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=G2uVQTw2j/6liB+j/qVuSBCnMkLU2gDIzMTXgMJflAUHUYFun2JSFBjg8tPD5c2vTr0UE8eMPKVFqENm0UUZnDo9gK5qNnotn/2pu1gaqvgxk9JPuvIp+dn3DaGfA4GNq8Ci++JjX1oGu3eKSHPH+FYIuaZj7zw1Xq/C0bkqPuw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=M5iGUe1g; arc=none smtp.client-ip=209.85.208.69 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.b="M5iGUe1g" Received: by mail-ed1-f69.google.com with SMTP id 4fb4d7f45d1cf-6a6634614cfso1058883a12.3 for ; Wed, 02 Sep 2026 03:51:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346273; x=1788951073; 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=0x2qbND6Sa3WNSOYkn6lqr5Ld4Ihzkg79AVpCRYTR1A=; b=M5iGUe1gc0hu7UCXVuZQ6eqxeK53tIsgVH0pkcje8+eax6BHdYwFfRWJGRlAB4BPGQ XVbtw3L5t1VXi+9pWMrXUesFJgS1nhFpbQ1oewj3KIt6kt+QmtW4jHXHzOwNW69IQ9W0 8nVrw1NgRHiZYl9or3IGCAQaRgpzQTKP5tD/X5b9FM4pxlWB/gejhrdgsTHme9i56P04 un3E8AYBjomzrSBcGxv/eKQ0rUpxAEC319HUjySf/+Jdp0JZ4v0QdR63jbUX8wtWe+7u jX1+ik0c5yPMnZqQGZByUYIPbAEDyKLW5grqvg/6F/ayDR5HqHojiqE/PQxfz+koyg3n MMZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346273; x=1788951073; 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=0x2qbND6Sa3WNSOYkn6lqr5Ld4Ihzkg79AVpCRYTR1A=; b=bAIwL5QsGPZNmumg3mkh/nZs3jNYDXwSXWkFi6xBKfAqegCTBJ8uoWHOmFHfrML5y9 v4E7Z0Sg1DsDAnF26X3c78/EoKaCmN/RkqDogFOKahmSknTt9uCi8Oej9FSxia9gsDHs 9abJOVFBC1jVqUKEcZ/fXx7cCtQyEcV5jerSNLaNs/+sTVHda+YE5AyD1uypd0lbOk1r lBeUGb2MtbW+lw3Uodbqhwzei0w7/5bHqnztVXC2vsI8/i+6MtFZ8DThgZpPEyYYc+Br kMfRjm4VOhjqS/u+n182IZSdZ2z/zh+5R1W+WLLcf1js8+Bn0TSnNx8iIpDq0kmnIl3q 4yoA== X-Forwarded-Encrypted: i=1; AKwUvBxOEJxq6oJnhg26fJvrCQwV3GDF8R1w2pZNaZ1JmtCbEHpazJtNTcuuiBUxDknt5XHs1ZZrJGyGAl9E/Fs=@vger.kernel.org X-Gm-Message-State: AFuF++kb47blhX3UfAGALTKmkqOApEDJ2NetzX8L3yZpQ3zEk9dy9mfj wDTb3NN7+GlfWFReG2vjAlA32WWflSJ3mKgY+5xJEE2qMd7RBPR14LOt2yqijq49ohcK6u3ukcP O2XnpqBk8QT6PI4c0XFpPkw== X-Received: from edyf4.prod.google.com ([2002:a05:6402:684:b0:6a5:e070:f1f6]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:46c5:b0:6a3:f47c:969 with SMTP id 4fb4d7f45d1cf-6a68224ce3emr2605259a12.3.1788346272605; Wed, 02 Sep 2026 03:51:12 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:07 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-6-vdonnefort@google.com> Subject: [PATCH v9 05/10] arm64: can_set_direct_map() if BBML3 From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Systems supporting BBML3 can split blocks without risking unhandled page-faults. It is therefore safe for them to set the direct map unconditionally. Signed-off-by: Vincent Donnefort diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index bbe98ac9ad8c..58898ae53f5d 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -99,7 +99,8 @@ bool can_set_direct_map(void) * Realms need to make pages shared/protected at page granularity. */ return rodata_full || debug_pagealloc_enabled() || - arm64_kfence_can_set_direct_map() || is_realm_world(); + arm64_kfence_can_set_direct_map() || is_realm_world() || + system_supports_bbml3(); } =20 static int update_range_prot(unsigned long start, unsigned long size, --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) (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 85DA5471255 for ; Wed, 2 Sep 2026 10:51:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346294; cv=none; b=hTN9UWzl6xb/STwaNQk3f5tYsZzU7wrSiL9ktZxdlqT5Rc0Vs6WqRSCDWlGvJtwrilNffGK1a4jIQS+zw90VjoJbO9HTUueUjSNSzTbDFf6GFtiV8byUQNOtbkCf+oJDksKdmvS5XtE2f7muh0mfm7DSQCfWUhq79cOZkqU8rSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346294; c=relaxed/simple; bh=nMu6uOIdcSiaN+JYugdLeZy5798bpsbb/pHYStuoqbU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WDKwZ9Fw1ifdK+VitvhRy7wOmKmPxZA0Y8k7Ho+DTtVqc6P7d2xs1dvF1+C3RswJ8KPcLRJebiIfyWBCdS+HlM7kwEp+Lushi/L9S+wPOISZPv0FJ0AjXZ4D1f2Q6uN3E+TpLJ9oXNUmx1BlK6/pm9qXI7FtnQWjjCAExIsokv0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=u3PXF4vQ; arc=none smtp.client-ip=209.85.208.71 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.b="u3PXF4vQ" Received: by mail-ed1-f71.google.com with SMTP id 4fb4d7f45d1cf-6a57aa07476so1034732a12.3 for ; Wed, 02 Sep 2026 03:51:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346274; x=1788951074; 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=gODwxuTtOVKQ6CMnGDMT0l3+wYWk2p1Ok9ZsUXJwJCE=; b=u3PXF4vQsvb9b6DDt1uaqig+t6k0iJ0rZtFkFFlH2UTJupC/ymMzaK/xSrL/FmcT2U 9ODi9WZk1WG4X9Jj4TF0vigTq6t0W1UMJ+iO3XibVmfxi9j3Q9s2gWWCug5u5JPX3sjI 8IZBH5AtoU3bnhtKn5NATG9NE1V29igdbUDAgOOk7tJug5lwPpUZgJTuo9z5WoaOuHs8 AVQBaf7aux7ECtZ5LCUXIGgsZ8NU/XxzqhUk9aBNSAk/jWH8CLCfDbIJVac9JZfd3wNd JT+KQrJfXC1Wo+vCqkRup/sf9vLdhJdEuqInv5MkEr1Du+rbQ6V53WxFD88ZS7fCnkQh yEEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346274; x=1788951074; 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=gODwxuTtOVKQ6CMnGDMT0l3+wYWk2p1Ok9ZsUXJwJCE=; b=V4YrS1OaDK+JWaMHJd8V1Pk0/MhsCxYgLgyIEsnR2SxsFIytok/foUn6oSDvLU9YDR 3fAPrYTcR6XfBZWoTUqZf43UQCM6UTMKnnx6S2l+DMr8AuRCiyaQ9uW3tW0Y8U/iAklo WsmxiHgkvNmA0gKwB80RFLxYZ7/RbTvP9AZg3U8SKp9vyuH/f3NdXQ3yKenIf1k56BCi h31bees7jb9ea7ABjQOfphSmxQjmgREbY9HJtMT4MO4umhNooSQJKCdFhqa9H91jkBqp iokwag2bQs+dWYjuqulhpi0zQWf9nXfwqCYEr17dqgO39ObQwG0MiM+kMnwix4MZY4iR PaPQ== X-Forwarded-Encrypted: i=1; AKwUvBx4T1ry3EFti4GqllUVopRErQRKAhq20b21SVDG5HpagVcT362Cj0OnZbreVp78Xx9sFq+vMYzW4Rplv5U=@vger.kernel.org X-Gm-Message-State: AFuF++mBjFfVwMY6uppMf+K3OKa3P6Ny6S715zlVnoP5S2FzvRkRFdEI xef6kMox1B6H6zcaS57ePG4DtxoTkKd2h4zwheUqNJSVijMhrP0QkEY1BehS6IFDr74+/Sb+unm QAWWlT/uanoSrI0FvVJxjuA== X-Received: from edy6-n2.prod.google.com ([2002:a05:6402:5346:20b0:6a6:8ab2:8708]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:4284:b0:6a6:32f5:ff40 with SMTP id 4fb4d7f45d1cf-6a682af8134mr2906512a12.20.1788346274084; Wed, 02 Sep 2026 03:51:14 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:08 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-7-vdonnefort@google.com> Subject: [PATCH v9 06/10] arm64: Implement can_set_direct_map_range() From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For systems where can_set_direct_map() is false, it is still possible that a subregion of the direct map can be modified if it is mapped at the last-level. Add an implementation for can_set_direct_map_range(). It falls back to a page table walk to verify the mapping level if can_set_direct_map() is false. Signed-off-by: Vincent Donnefort diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/s= et_memory.h index 90f61b17275e..1a37f4ef130b 100644 --- a/arch/arm64/include/asm/set_memory.h +++ b/arch/arm64/include/asm/set_memory.h @@ -9,6 +9,9 @@ bool can_set_direct_map(void); #define can_set_direct_map can_set_direct_map =20 +bool can_set_direct_map_range(struct page *page, unsigned long nr_pages); +#define can_set_direct_map_range can_set_direct_map_range + int set_memory_valid(unsigned long addr, int numpages, int enable); =20 int set_direct_map_invalid_noflush(struct page *page); diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index 58898ae53f5d..c59ef17eb0d0 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -103,6 +103,48 @@ bool can_set_direct_map(void) system_supports_bbml3(); } =20 +bool can_set_direct_map_range(struct page *page, unsigned long nr_pages) +{ + unsigned long addr =3D (unsigned long)page_address(page); + unsigned long end =3D addr + nr_pages * PAGE_SIZE; + + if (can_set_direct_map()) + return true; + + /* + * If !can_set_direct_map() then no one can split blocks and it is safe + * to walk the page-table lockless. + */ + while (addr < end) { + pud_t *pudp, pud; + pmd_t *pmdp, pmd; + pgd_t *pgdp; + p4d_t *p4dp; + + pgdp =3D pgd_offset_k(addr); + if (pgd_none(READ_ONCE(*pgdp))) + return false; + + p4dp =3D p4d_offset(pgdp, addr); + if (p4d_none(READ_ONCE(*p4dp))) + return false; + + pudp =3D pud_offset(p4dp, addr); + pud =3D READ_ONCE(*pudp); + if (pud_none(pud) || pud_leaf(pud)) + return false; + + pmdp =3D pmd_offset(pudp, addr); + pmd =3D READ_ONCE(*pmdp); + if (pmd_none(pmd) || pmd_leaf(pmd)) + return false; + + addr =3D pmd_addr_end(addr, end); + } + + return true; +} + static int update_range_prot(unsigned long start, unsigned long size, pgprot_t set_mask, pgprot_t clear_mask) { --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) (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 C62F1471CFA for ; Wed, 2 Sep 2026 10:51:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346286; cv=none; b=IgW4RKt2cZLk1y/OGUSboJK0ne6LEXqDS+4ZyKwTmTw6mFYsSkzI/wo15WrZUyPnB7VJ/+1PmxwM9Otma1e56pcyAFycT49r/imIEPCk+h7/2aeweeDthAFqnwSDT+09F8hHYlHAgc4FQb/1eT9q8C3vVVDwJoZsnJngLoVd7K4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346286; c=relaxed/simple; bh=BkWHB+IxRJyp/mrL2MDxtxRI3LoQB6qxpIKEIBvf9+w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=U+qCGRklw/fhpv0LVJi4Us9Xl+tGgS94fA4h398PtElD2XOv+OvYs8dk7flQeMw4qRsTGPVbZbgvs35zYkNnJuvgpcoG5c2mEq4DRMeGboii6pXdVIJ+7+AwSunuBRHUgtTkKZoH7nYJ43VAQ3O4fN5fTZHZed0C04iKxTeyv/c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BFKpjqZG; arc=none smtp.client-ip=209.85.128.69 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.b="BFKpjqZG" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-49b8c651ac0so10256865e9.2 for ; Wed, 02 Sep 2026 03:51:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346275; x=1788951075; 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=TNWZLpQFf8So7isbdfRHNiNRkktdYQTRcSFjKmsQSY0=; b=BFKpjqZGG9ZFudht7p8ohZUiD42cVUS8Mx1ongokDof2Fn9NyBS9ciAixLiPp3qyys o+kaLmLXT4bc+NHKn5eHKho60KauP+ghtv8AblQKLbyT/JmO6yJKrgL2RAlWqo7tgN53 NWnCcxfVUumyyNBWGMH5qEQLvwsD+aOQjQwrujvXC7Ufk/KzZ52z9EHkzCoEIKhVjwDu u7IhAdkZkSHQBo+kYO+62PylsK8ePSwoh4HFNoUDPHNewrWwpv42Gs1109obDhnyv1XV s4aaRoe6Pmecx6KkO1bXXMrQGvjBNFcNMkitp8sIy3uA0Nk+qJ9evHvlg7uZKaJse6UM uLIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346275; x=1788951075; 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=TNWZLpQFf8So7isbdfRHNiNRkktdYQTRcSFjKmsQSY0=; b=YOoRBIyeTs6sp1mi9aOC3CadPUbf7aohumqok1m26pBPb0qpw2222GZSvf+Ue8JwJa 41wg01SqjEBcaXdNfqQP0ke6jQ49edZuRb49nfS8/uvHIaC2OIJwE+s9I13flSsHyvGA rl49vtTMwtYNEUUG3WDvAbxHMpUHsFLsDvsLuVC/xd06ZDrtCZInFyLKID72EzQhpCdk OL6CuhGOqoRrsgdRc11N+jB6+ydAsrWgHiBtzAhQllkrargEXFBMx9iglfUtage2kPtM FO45OWUAlY/jz5mXpWJtg6a5FgukYoW1CiZCFNViNf5I+QrMenteZZiAOrR/9LZ0ZrfJ UkHg== X-Forwarded-Encrypted: i=1; AHgh+RrU0Zm8/Uyt+fI7V7j5AeclWuqVbRAZXUThUkeeXLHiptJoQYZ6cCyIernUhCaA7ES77CWIGRoIn5seH5E=@vger.kernel.org X-Gm-Message-State: AFuF++kyVEnr7HIb61Yr2ZL+abWSKIgCtEr0OqsCCqTGBph0jobipRwO //EvA8f5bGALh2+8GqFeRBFbcNYMTFwzQhEMM/8JtTZxsep8QqbqZ+lBI2urUuAPfg1P9SUyRLw nS/y3TTHr9UuwphV5SzKqBQ== X-Received: from wrpe17.prod.google.com ([2002:adf:f351:0:b0:484:3204:23be]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e93:b0:499:cd34:100d with SMTP id 5b1f17b1804b1-49ce57f5235mr66954815e9.7.1788346275192; Wed, 02 Sep 2026 03:51:15 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:09 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-8-vdonnefort@google.com> Subject: [PATCH v9 07/10] arm64: Implement __set_direct_map*() From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add implementation for the unsafe functions __set_direct_map*(). They do not verify for can_set_direct_map() and expect the caller to do so beforehand. Signed-off-by: Vincent Donnefort diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/s= et_memory.h index 1a37f4ef130b..080a40846bbe 100644 --- a/arch/arm64/include/asm/set_memory.h +++ b/arch/arm64/include/asm/set_memory.h @@ -16,6 +16,10 @@ int set_memory_valid(unsigned long addr, int numpages, i= nt enable); =20 int set_direct_map_invalid_noflush(struct page *page); int set_direct_map_default_noflush(struct page *page); +int __set_direct_map_invalid_noflush(struct page *page); +#define __set_direct_map_invalid_noflush __set_direct_map_invalid_noflush +int __set_direct_map_default_noflush(struct page *page); +#define __set_direct_map_default_noflush __set_direct_map_default_noflush int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d); bool kernel_page_present(struct page *page); =20 diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index c59ef17eb0d0..28adab0edace 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -294,28 +294,38 @@ int set_memory_valid(unsigned long addr, int numpages= , int enable) __pgprot(PTE_PRESENT_VALID_KERNEL)); } =20 -int set_direct_map_invalid_noflush(struct page *page) +int __set_direct_map_invalid_noflush(struct page *page) { pgprot_t clear_mask =3D __pgprot(PTE_PRESENT_VALID_KERNEL); pgprot_t set_mask =3D __pgprot(PTE_PRESENT_INVALID); =20 + return update_range_prot((unsigned long)page_address(page), + PAGE_SIZE, set_mask, clear_mask); +} + +int set_direct_map_invalid_noflush(struct page *page) +{ if (!can_set_direct_map()) return 0; =20 + return __set_direct_map_invalid_noflush(page); +} + +int __set_direct_map_default_noflush(struct page *page) +{ + pgprot_t set_mask =3D __pgprot(PTE_PRESENT_VALID_KERNEL | PTE_WRITE); + pgprot_t clear_mask =3D __pgprot(PTE_PRESENT_INVALID | PTE_RDONLY); + return update_range_prot((unsigned long)page_address(page), PAGE_SIZE, set_mask, clear_mask); } =20 int set_direct_map_default_noflush(struct page *page) { - pgprot_t set_mask =3D __pgprot(PTE_PRESENT_VALID_KERNEL | PTE_WRITE); - pgprot_t clear_mask =3D __pgprot(PTE_PRESENT_INVALID | PTE_RDONLY); - if (!can_set_direct_map()) return 0; =20 - return update_range_prot((unsigned long)page_address(page), - PAGE_SIZE, set_mask, clear_mask); + return __set_direct_map_default_noflush(page); } =20 static int __set_memory_enc_dec(unsigned long addr, --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) (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 31BA5472533 for ; Wed, 2 Sep 2026 10:51:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346293; cv=none; b=XoNKP8eWgepPo/qzVEXhL7r4ToAhXkYiu+SAHrRluA5GZUEkVK1tJoYaWh2poKe9/ZVSYQ0FzsoNATqo+KiSjzqDvn/gzCHC2bb1PaUpZrfoIskf6VVTbbzgzXdp5WJxYduPadMzmOPfU/kHTWstixPecjHju2LvYAQ+GtutoX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346293; c=relaxed/simple; bh=fI4ct/3pSqJy24dcpl8O0GRnGyvmcETu0BAstHM0k+s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fjZ/sAAj0UF2vVqoBOWNzkCiArP6jvkD4gyJf/MoskchzZY5rC8bp411U0ZSf/0glfkh3L7X1uaVp8h6fkC9NhcERiVXHiCwuVMjJUzXma/giL2qS7SziABqurAdvk4BDVKDk9bFvMI9ZI45LtZg2g5Z6qFLFx6rnkt4SGKSpLI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ruJvCxVs; arc=none smtp.client-ip=209.85.221.69 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.b="ruJvCxVs" Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-47d81cf0c4cso699765f8f.2 for ; Wed, 02 Sep 2026 03:51:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346276; x=1788951076; 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=IlzRHwAUXMpKspjrSSJuu5KTpj2eywEkwws+9IOUBiI=; b=ruJvCxVsxGsTKa3DR36ZuhNxvUeZupbt8wJDMaiJ6rkndeRHZzaamJIWlqweFwdyPY uwLnuWEI+h+r7bhZm1/7odgOey6p9IW0Zp4MWTlIsBBeHGYKmu8qTrM4Xfv9iP7bV0Ev q0WTOZjZgsmbYpjOa6HnpwN7z2LIhCdc2ibTUQkiQ4CCB2JcY/WClwIAJaOCdsCc4IxC qZqBcFVAU5GIUoFntNgrwPVOyDzxSrNHCrmm+ry3Nn64qFGR3FpF2EiirMg0Qg3lXdWF GjghRqqX9YMRO9HJfAGM2I1T4Cg7157/DomozoSOL22Ve4Fj9L0vKbiyeDDmoqsTrxR7 brmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346276; x=1788951076; 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=IlzRHwAUXMpKspjrSSJuu5KTpj2eywEkwws+9IOUBiI=; b=Vc3Z/UC+Wbi4m2CT7jyArYwKMdMKLnLinSpERBZ/Or/hR84T3ibqV47pTuRvUe0RDq Ep9B7Sdub+urhCPKbh9LstBbRBgsRnDbZMRVRdbm6ohd/wyqVkooEv85Q2Gl5b64XJVl M1GOu9QqkbZmC0XBz7WDVd4HbSf7qlNJ+/AxnpyhNRCztR5Kh6oTzofuix92PjXZMiiz YMCVknqsoI5VAE6T6DoeZSVknvzBK09dwIhKCry5j6zeieytn7NVqPnt3VVCx7tqwjV8 nhw/ZvnkeX1I90eDsfOwoB2R6IvpQRn6Y/x/W0JS26mSfM87lotEKDLx1Dw+vQrkKMRr W5WA== X-Forwarded-Encrypted: i=1; AKwUvBxjCGs8rCqH1XNh3hbLTfBPRxdeIOJVYBF9x5wyrJu+PTCUQtnB7XMF7orSnQP+K1Q9hTLr5C0fOfQdRcs=@vger.kernel.org X-Gm-Message-State: AFuF++n/56hp5nggA4zrmpNJfDqbaBBIB/8DYVRC7Y64u4Otsz1BTlr9 JnljrOpFqDROXzW9xijUo2Zot73s56gqZG2cCj9JlAkwMzYf7TmnDOAxhZ9BU5aw4Balh8dQ403 Z53Pg6R+LU6OQUQLQgkY3Eg== X-Received: from wrqr17.prod.google.com ([2002:a5d:4991:0:b0:482:abe4:58a8]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:5f47:0:b0:482:fc30:a1b4 with SMTP id ffacd0b85a97d-48488e03952mr6019121f8f.5.1788346276079; Wed, 02 Sep 2026 03:51:16 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:10 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-9-vdonnefort@google.com> Subject: [PATCH v9 08/10] arm64: Add support for MEMBLOCK_LLMAP From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" With the MEMBLOCK_LLMAP flag, force a last-level mapping. Signed-off-by: Vincent Donnefort diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 79d90226fd5d..c0fcc76914d1 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1184,9 +1184,8 @@ static void __init map_mem(void) phys_addr_t init_begin =3D __pa_symbol(__init_begin); phys_addr_t init_end =3D __pa_symbol(__init_end); phys_addr_t kernel_end =3D __pa_symbol(__bss_stop); - phys_addr_t start, end; int flags =3D NO_EXEC_MAPPINGS; - u64 i; + struct memblock_region *r; =20 /* * Setting hierarchical PXNTable attributes on table entries covering @@ -1226,9 +1225,13 @@ static void __init map_mem(void) flags); =20 /* map all the memory banks */ - for_each_mem_range(i, &start, &end) { + for_each_mem_region(r) { + phys_addr_t start, end; + + if (memblock_is_nomap(r)) + continue; /* - * for_each_mem_range may return sub-page-aligned boundaries + * for_each_mem_region may return sub-page-aligned boundaries * after memblock_mark_nomap() splits regions at byte precision. * __create_pgd_mapping_locked aligns phys down to PAGE_MASK, * which could accidentally map no-map memory on the boundary. @@ -1237,17 +1240,23 @@ static void __init map_mem(void) * regions. The cost is at most one page of unmapped gap at * each boundary. */ - start =3D PAGE_ALIGN(start); - end =3D end & PAGE_MASK; + start =3D PAGE_ALIGN(r->base); + end =3D (r->base + r->size) & PAGE_MASK; if (start >=3D end) continue; + + int rflags =3D flags; + + if (memblock_is_llmap(r)) + rflags |=3D NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS; + /* * The linear map must allow allocation tags reading/writing * if MTE is present. Otherwise, it has the same attributes as * PAGE_KERNEL. */ __map_memblock(start, end, pgprot_tagged(PAGE_KERNEL), - flags); + rflags); } } =20 --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) (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 CBB86472075 for ; Wed, 2 Sep 2026 10:51:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346290; cv=none; b=b3Yh6OVUAjcqhTgGIGNeMHBfW5yzHpWGNuA+M1Gl1qknRmfEIABeGE8ckhMm47udyXzSp6x0PYxdFdC2yy6u96DkmXAxNHfkRHYdSHOYF+Md7DXuapR24qxEvcaD3RUIzGmn2qkFaTUTaD3cW1Q63HRMEW+3v4i3FI/0lehmPBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346290; c=relaxed/simple; bh=kTw+a5cGg9fTfwWcDo0uZpH7mwb0/GZmgWLGcOqsPDM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Cg2wtuszzdjhfGJCkKk8ICUPUmNyV5aZIV7PIT8h5LUSrbtCd79i2WkUpZa5MtPm5UKEjpgEcpsdaHgAq2d2Z02STyjk6QlX3tb91Ekumi9fRGT1Q3RPHhEgFxhRIiU1jqpacR4Je3CaqD/3jP6dNALl6D6ZNPvflHOcGg4n8/Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=UC+bVqb+; arc=none smtp.client-ip=209.85.128.69 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.b="UC+bVqb+" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-49cd74fc1aaso4706325e9.1 for ; Wed, 02 Sep 2026 03:51:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346277; x=1788951077; 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=xnnAKTx0rWFGRttv0vRYvbBX3qhJSeyXfYhwCY9t/xQ=; b=UC+bVqb+EofhB5NYpXaXML6PEgtAE8Dndt7tsWfldqIHii9FV6g+Ry3Ns3Su4SR+rU aYy16Nv8puKhdlz9XO/28vxrPJ6ijDvBX7At8LWjV6yUOJSm7MPR6x8n5pDTV0zLyoBE BrOKHCOwXc9hIRLVcygdCLQhyaMFirQv5BQ2yMmXn5bIV/py6TXrunQxEiNxE3eSHIMp S/5kWKge6ziv83eGGMGfRAL32g0sw9tK9p6vlJ8GNcnwFOisAWkp0GnaxA+IGt86f0rz MkZ7536jutQn3tvUfL/XBNnYApjZ0VP40Uf+WcKPLpdQQe8vhX9cMFGUTjwHKI+66JPV 01xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346277; x=1788951077; 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=xnnAKTx0rWFGRttv0vRYvbBX3qhJSeyXfYhwCY9t/xQ=; b=ZT3d/cl6WtL/x5ghJ+Tw2PjxfSTqefR/iRag8kDQKKx76vMNiYHIxUqmzIRDuZMlq4 ZE8b/fYbR+OI+nxlXhSkEyZoqxlUt1gW1Ldrg8wDXcdhmCvfD2HSKlr00E13b6MkRGvr ZHWdvviCA6iEPY6w0hsAvQfJUAMettosGD0WO/ZLp/KKpzcykMEzm8rhLxTgzMeh6svq 9JYtCmp2s6mxxQ48G4WD2Rffea9ccmlCCapEqe+ytfjioWBiMblU96cJo2fNY0jK8mgN MI9cWhOoOCya3uilE0j0e63WoR9FmB2Qvw4b6JdbPLnSQTHaNinp56tNAqlIyUqgbGCC Z3YQ== X-Forwarded-Encrypted: i=1; AHgh+RqaFVE2UMAXyvnTby2AbbYa8gUjWoJaNdutpZ4Doe+2kK1/dzCWGezI+WaevUE++b0FtfKtEJokY7MmkrA=@vger.kernel.org X-Gm-Message-State: AFuF++mw2OOCN1fKHETc91RP72G73x87ae0QsGGVeUWATa8+pqSldA4q iPI7Tg2/XVS3Qn6T5yQtn4t3z3KFmOC/JAk728AaOu8vJIdSf6eJdi4MuCEH0X3AyrINR5H48lX utnjo+TqqdrydjEwIXEk81w== X-Received: from wmqh12.prod.google.com ([2002:a05:600c:350c:b0:496:c04d:501e]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:310f:b0:49b:c8e:a211 with SMTP id 5b1f17b1804b1-49ce57f27e8mr57275175e9.5.1788346277042; Wed, 02 Sep 2026 03:51:17 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:11 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-10-vdonnefort@google.com> Subject: [PATCH v9 09/10] firmware: arm_ffa: Introduce ffa-lend-pool From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When memory is lent to the Secure world via FF-A, fatal CPU speculative reads from Non-Secure can still occur as long as it retains a cacheable mapping to that memory. Introduce the "arm,ffa-lend-pool" reserved-memory CMA driver to unmap pages before lending (ffa_prepare_lend()) and restore them upon reclaim (ffa_lend_reclaimed()). Devices bind to the pool via the "memory-region" DT property or via ffa_lend_pool_attach(). reserved-memory { #address-cells =3D <0x2>; #size-cells =3D <0x2>; ranges; ffa_lend: ffa-lend-pool { compatible =3D "arm,ffa-lend-pool"; reusable; ll-map; size =3D <0x0 0x4000000>; }; }; Signed-off-by: Vincent Donnefort diff --git a/drivers/firmware/arm_ffa/Kconfig b/drivers/firmware/arm_ffa/Kc= onfig index 5e3ae5cf82e8..66dbf74c37c3 100644 --- a/drivers/firmware/arm_ffa/Kconfig +++ b/drivers/firmware/arm_ffa/Kconfig @@ -19,3 +19,8 @@ config ARM_FFA_SMCCC bool default ARM_FFA_TRANSPORT depends on ARM64 && HAVE_ARM_SMCCC_DISCOVERY + +config ARM_FFA_LEND_POOL + bool + default y + depends on ARM_FFA_TRANSPORT && CMA && OF_RESERVED_MEM diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/M= akefile index 168990a7e792..5ea3019c407b 100644 --- a/drivers/firmware/arm_ffa/Makefile +++ b/drivers/firmware/arm_ffa/Makefile @@ -6,3 +6,4 @@ ffa-core-objs :=3D $(ffa-bus-y) ffa-module-objs :=3D $(ffa-driver-y) $(ffa-transport-y) obj-$(CONFIG_ARM_FFA_TRANSPORT) =3D ffa-core.o obj-$(CONFIG_ARM_FFA_TRANSPORT) +=3D ffa-module.o +obj-$(CONFIG_ARM_FFA_LEND_POOL) +=3D lend_pool.o diff --git a/drivers/firmware/arm_ffa/lend_pool.c b/drivers/firmware/arm_ff= a/lend_pool.c new file mode 100644 index 000000000000..67a36f5d5aa6 --- /dev/null +++ b/drivers/firmware/arm_ffa/lend_pool.c @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Arm FF-A Reserved Memory CMA driver for Memory Lending + * + * Prevents CPU speculative reads to secure memory by unmapping it from the + * kernel direct map. This only works if the reserved-memory is mapped at = the + * last-level ("ll-map;" or "rodata=3Dfull") or if all CPUs in the system = support + * BBML3. + * + * Copyright (C) 2026 Google LLC + * Author: Vincent Donnefort + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static DEFINE_XARRAY(ffa_lend_devices); + +static bool ffa_lend_pool_contains(struct device *dev, phys_addr_t addr, s= ize_t size) +{ + phys_addr_t base, end; + + if (!dev) + return false; + + guard(rcu)(); + + if (xa_load(&ffa_lend_devices, (unsigned long)dev) !=3D dev) + return false; + + if (WARN_ON_ONCE(!dev->cma_area)) + return false; + + base =3D cma_get_base(dev->cma_area); + end =3D base + cma_get_size(dev->cma_area); + + return addr >=3D base && (addr + size) <=3D end; +} + +/** + * ffa_prepare_lend() - Prepare a memory region to be lent in FF-A + * @dev: Device attached to the lend pool + * @addr: Physical start address of the memory region + * @size: Size in bytes + * + * When memory is lent via FF-A, TrustZone transitions it to the secure st= ate. + * As long as Arm CPUs retain a valid mapping to that now-secure memory, t= hey + * can speculatively read it, which is fatal on some systems. + * + * ffa_prepare_lend() prevents this by unmapping the memory range from the + * kernel's direct map. + * + * Return: 0 on success, negative error code otherwise. + */ +int ffa_prepare_lend(struct device *dev, phys_addr_t addr, size_t size) +{ + unsigned long nr_pages =3D size >> PAGE_SHIFT; + struct page *page; + unsigned long i; + int ret; + + if (!ffa_lend_pool_contains(dev, addr, size)) + return -ENODEV; + + page =3D pfn_to_page(PHYS_PFN(addr)); + for (i =3D 0; i < nr_pages; i++) { + ret =3D __set_direct_map_invalid_noflush(page + i); + + if (ret) { + while (i--) + __set_direct_map_default_noflush(page + i); + + return ret; + } + } + + return 0; +} +EXPORT_SYMBOL_GPL(ffa_prepare_lend); + +/** + * ffa_lend_reclaimed() - Restore a reclaimed FF-A memory region + * @dev: Device attached to the lend pool + * @addr: Physical start address of the memory region + * @size: Size in bytes + * + * Restores a memory range into the kernel's direct mapping. It must be ca= lled + * after a successful FF-A memory reclaim invocation. + */ +void ffa_lend_reclaimed(struct device *dev, phys_addr_t addr, size_t size) +{ + unsigned long nr_pages =3D size >> PAGE_SHIFT; + struct page *page; + unsigned long i; + + if (!ffa_lend_pool_contains(dev, addr, size)) + return; + + page =3D pfn_to_page(PHYS_PFN(addr)); + for (i =3D 0; i < nr_pages; i++) + __set_direct_map_default_noflush(page + i); +} +EXPORT_SYMBOL_GPL(ffa_lend_reclaimed); + +/** + * ffa_lend_pool_attach() - Attach a device to the FF-A lend pool + * @dev: Device to attach + * + * FF-A devices are dynamically discovered and might not have an associated + * device tree node with a "memory-region" phandle. In that case, drivers = must + * use this function to attach to the "arm,ffa-lend-pool" reserved memory + * region. + * + * Return: 0 on success, negative error code otherwise. + */ +int ffa_lend_pool_attach(struct device *dev) +{ + struct device_node *np; + struct reserved_mem *rmem; + + np =3D of_find_compatible_node(NULL, NULL, "arm,ffa-lend-pool"); + if (!np) + return -ENODEV; + + rmem =3D of_reserved_mem_lookup(np); + of_node_put(np); + if (!rmem || !rmem->ops || !rmem->ops->device_init) + return -EINVAL; + + return rmem->ops->device_init(rmem, dev); +} +EXPORT_SYMBOL_GPL(ffa_lend_pool_attach); + +/** + * ffa_lend_pool_detach() - Detach a device from the FF-A lend pool + * @dev: Device to detach + * + * Releases the device from the "arm,ffa-lend-pool" reserved memory region. + */ +void ffa_lend_pool_detach(struct device *dev) +{ + struct device_node *np; + struct reserved_mem *rmem; + + np =3D of_find_compatible_node(NULL, NULL, "arm,ffa-lend-pool"); + if (!np) + return; + + rmem =3D of_reserved_mem_lookup(np); + of_node_put(np); + + if (rmem && rmem->ops && rmem->ops->device_release) + rmem->ops->device_release(rmem, dev); +} +EXPORT_SYMBOL_GPL(ffa_lend_pool_detach); + +static int __init ffa_lend_pool_setup(unsigned long node, struct reserved_= mem *rmem) +{ + struct cma *cma; + int ret; + + if (!of_get_flat_dt_prop(node, "reusable", NULL) || + of_get_flat_dt_prop(node, "no-map", NULL)) { + pr_err("FF-A lend pool: node must be 'reusable' and not 'no-map'\n"); + return -EINVAL; + } + + if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) { + pr_err("FF-A lend pool: incorrect alignment of CMA region\n"); + return -EINVAL; + } + + ret =3D cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma= ); + if (ret) { + pr_err("FF-A lend pool: unable to setup CMA region (%d)\n", ret); + return ret; + } + + rmem->priv =3D cma; + + return 0; +} + +static int ffa_lend_pool_device_init(struct reserved_mem *rmem, struct dev= ice *dev) +{ + int ret; + + if (!can_set_direct_map_range(pfn_to_page(PHYS_PFN(rmem->base)), rmem->si= ze / PAGE_SIZE)) { + pr_err("FF-A lend pool: reserved memory cannot be unmapped in direct map= \n"); + return -EINVAL; + } + + dev->cma_area =3D rmem->priv; + + ret =3D xa_err(xa_store(&ffa_lend_devices, (unsigned long)dev, dev, GFP_K= ERNEL)); + if (ret) + dev->cma_area =3D NULL; + + return ret; +} + +static void ffa_lend_pool_device_release(struct reserved_mem *rmem, struct= device *dev) +{ + xa_erase(&ffa_lend_devices, (unsigned long)dev); + dev->cma_area =3D NULL; +} + +static const struct reserved_mem_ops ffa_lend_pool_ops =3D { + .node_init =3D ffa_lend_pool_setup, + .device_init =3D ffa_lend_pool_device_init, + .device_release =3D ffa_lend_pool_device_release, +}; +RESERVEDMEM_OF_DECLARE(ffa_lend_pool, "arm,ffa-lend-pool", &ffa_lend_pool_= ops); diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h index e71d83ee0aef..fa3570f85ff7 100644 --- a/include/linux/arm_ffa.h +++ b/include/linux/arm_ffa.h @@ -519,4 +519,25 @@ struct ffa_ops { const struct ffa_notifier_ops *notifier_ops; }; =20 +#if IS_ENABLED(CONFIG_ARM_FFA_LEND_POOL) +int ffa_lend_pool_attach(struct device *dev); +void ffa_lend_pool_detach(struct device *dev); +int ffa_prepare_lend(struct device *dev, phys_addr_t paddr, size_t size); +void ffa_lend_reclaimed(struct device *dev, phys_addr_t paddr, size_t size= ); +#else +static inline int ffa_lend_pool_attach(struct device *dev) +{ + return -ENODEV; +} +static inline void ffa_lend_pool_detach(struct device *dev) +{ +} +static inline int ffa_prepare_lend(struct device *dev, phys_addr_t paddr, = size_t size) +{ + return -ENODEV; +} +static inline void ffa_lend_reclaimed(struct device *dev, phys_addr_t padd= r, size_t size) +{ +} +#endif #endif /* _LINUX_ARM_FFA_H */ --=20 2.55.0.970.g62bdec98f9-goog From nobody Thu Sep 24 20:02:45 2026 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) (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 E1F0946EF75 for ; Wed, 2 Sep 2026 10:51:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346299; cv=none; b=aKxkMPi/apbCxKDflgSMeNj+jV5jvqyNxQrDQa0v8gajtHnD7nKb9uwNRLbW61nHL6sicp8c2AwiJnaOfyahs2jamQ2MqjC+FHjQuKHpM26Is4MJrxrRRmmqnzPLeLw4xudleT926u9faaW0r5bQ0Iq9Dzz2abBXNNXWC032sX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788346299; c=relaxed/simple; bh=IR5a7dw8niUl1D2oqM5QJBMPZf1MLc6PkEbzReKAZA0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rOlxaQa43+mZEPlK9bC09uiKCLsijsXdJS9aQ1EzxOmkd4Ba4Cx8L5FmM25GErwcu+rboX3g4ynCQ7SP+Z8rNu+uNlSw/eRul0ZFeZyTY+9D+RCwFCtuw0lqRc2pXeigRhd6qYxtYT8IWwQcSRtymQ2d3JQIHt7yM+81rE6rLss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WXuXAD+N; arc=none smtp.client-ip=209.85.128.69 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.b="WXuXAD+N" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-493fa6e28a7so8375245e9.1 for ; Wed, 02 Sep 2026 03:51:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788346279; x=1788951079; 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=w1wC9u3twhPNjqquLWPyT5Y0R6x/ILvd7DMTdNgZ19s=; b=WXuXAD+NsAQlcuemeby70nHcrjsZoBBMWjHzvJF9i0K/iI3X6b+YvlfPk3Vah9xNlD f1wilQQd0JZ9zCAsQBBKbYBVc05hEDXHEUhQ48ccCmLqaN32LLsFVLx9NAOi7yZcOL35 UancxbOuVa0q4/lFgGIIuyYQ18rgveak81+CQP3SYHKyTp3C7cXjAQHoOydlU70n3i1T pGSXps3GZvdIfe/s4swNy/FnbnylWaVo5QypyZe/SasCdz/mQ9Z1phjNGK0IxoWTmFzI 1LbpKa+OjnFZ2dc/CXDW1wEJs6m9e6RykuOF3/xeZgxpHR3a0Ibo93wd9NNsfhGlyDkT GnLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788346279; x=1788951079; 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=w1wC9u3twhPNjqquLWPyT5Y0R6x/ILvd7DMTdNgZ19s=; b=oRJaTo8hVf2u17dqLA85hZ7mX2wk9upiaH92O4z46ma5qaEFFpK9NY2u41V9DKyhMf oldGN2rx18Vo/1JVLjhGZB3on6Ip0LYa+EE2VeQTHmUPxkEYwpi07Iw5OAB+qMJb5XDS 8FJPhZfSc5DRkgnSNxvhADQGWMt7XLAqxEGcjxYTNJc7odRkUgjZVYoJ9zefHRtdukdA SNKQy26kK8hYPh9IrZrdIiXDDzmtXpTJwKB1RqclmwJB8WVdU4vSGPMzvG+UI7nvAbIt RmgYE/OCBAjyt00I3j3FnPS2xAbccB2EN09/yTdalxkllqqWep+oJEzpbfGy3A7e1BAh 3rGA== X-Forwarded-Encrypted: i=1; AHgh+Rq6Zc+WBa2UbT8XLNqT14AM2g/XqRT4aYAHyu9CI4ID1Uh5l4xEoSpXwKGvgcudxqO7HeIUeqf3tjg4itc=@vger.kernel.org X-Gm-Message-State: AFuF++mXHKS0P/4SYRvN+KEes2Kda6o6/U52/oYuiOCr5qmTgX/g2NZx 3lTKs3/tQpFyA+yYUaDAUkVCv5dlqyuKAEjZjwtIZFlaLUmCt9v+dUkuCI6nLsvlCzfyBf9fwKi R1FyrJ5IykM82Rj3iRtqZww== X-Received: from wmqy14.prod.google.com ([2002:a05:600c:364e:b0:49c:ca29:c0ed]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:5653:b0:49c:eb17:cf3b with SMTP id 5b1f17b1804b1-49ceb17cff4mr15337645e9.8.1788346278647; Wed, 02 Sep 2026 03:51:18 -0700 (PDT) Date: Wed, 2 Sep 2026 11:47:12 +0100 In-Reply-To: <20260902104712.2399797-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260902104712.2399797-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260902104712.2399797-11-vdonnefort@google.com> Subject: [PATCH v9 10/10] optee: Add support for arm,ffa-lend-pool From: Vincent Donnefort To: catalin.marinas@arm.com, will@kernel.org, rppt@kernel.org, akpm@linux-foundation.org, sudeep.holla@kernel.org, jenswi@kernel.org, robh@kernel.org Cc: mark.rutland@arm.com, sumit.garg@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, op-tee@lists.trustedfirmware.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hook OP-TEE dynamically allocated protected memory pools to the "arm,ffa-lend-pool" driver. While the SMC transport platform device resolves the pool through its DT "memory-region" property, the FF-A transport lacks a device tree node and binds via ffa_lend_pool_attach(). Signed-off-by: Vincent Donnefort diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 633715b98625..4d6555171918 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -979,6 +979,7 @@ static void optee_ffa_remove(struct ffa_device *ffa_dev) =20 mutex_destroy(&optee->ffa.mutex); rhashtable_free_and_destroy(&optee->ffa.global_ids, rh_free_fn, NULL); + ffa_lend_pool_detach(&optee->teedev->dev); =20 kfree(optee); } @@ -1042,13 +1043,21 @@ static int optee_ffa_protmem_pool_init(struct optee= *optee, u32 sec_caps) int rc =3D 0; =20 if (sec_caps & OPTEE_FFA_SEC_CAP_PROTMEM) { + rc =3D ffa_lend_pool_attach(&optee->teedev->dev); + if (rc && rc !=3D -ENODEV) + return rc; + pool =3D optee_protmem_alloc_dyn_pool(optee, id); - if (IS_ERR(pool)) + if (IS_ERR(pool)) { + ffa_lend_pool_detach(&optee->teedev->dev); return PTR_ERR(pool); + } =20 rc =3D tee_device_register_dma_heap(optee->teedev, id, pool); - if (rc) + if (rc) { pool->ops->destroy_pool(pool); + ffa_lend_pool_detach(&optee->teedev->dev); + } } =20 return rc; diff --git a/drivers/tee/optee/protmem.c b/drivers/tee/optee/protmem.c index be3abf6e8aa6..9b64db9b4e64 100644 --- a/drivers/tee/optee/protmem.c +++ b/drivers/tee/optee/protmem.c @@ -42,14 +42,6 @@ static int init_dyn_protmem(struct optee_protmem_dyn_poo= l *rp) goto err_null_protmem; } =20 - /* - * TODO unmap the memory range since the physical memory will - * become inaccesible after the lend_protmem() call. - * - * If the platform supports a hypervisor at EL2, it will unmap the - * intermediate physical memory for us and stop cache pre-fetch of - * the memory. - */ rc =3D rp->optee->ops->lend_protmem(rp->optee, rp->protmem, rp->mem_attrs, rp->mem_attr_count, rp->use_case); diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index b8a2bdac3208..5949aa717cad 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -1528,6 +1529,8 @@ static void optee_smc_remove(struct platform_device *= pdev) if (optee->smc.memremaped_shm) memunmap(optee->smc.memremaped_shm); =20 + of_reserved_mem_device_release(&optee->teedev->dev); + kfree(optee); } =20 @@ -1712,16 +1715,22 @@ static int optee_protmem_pool_init(struct optee *op= tee) if (!protm && !dyn_protm) return 0; =20 + of_reserved_mem_device_init_by_idx(&optee->teedev->dev, + dev_of_node(optee->teedev->dev.parent), 0); if (protm) pool =3D static_protmem_pool_init(optee); if (dyn_protm && IS_ERR(pool)) pool =3D optee_protmem_alloc_dyn_pool(optee, heap_id); - if (IS_ERR(pool)) + if (IS_ERR(pool)) { + of_reserved_mem_device_release(&optee->teedev->dev); return PTR_ERR(pool); + } =20 rc =3D tee_device_register_dma_heap(optee->teedev, heap_id, pool); - if (rc) + if (rc) { pool->ops->destroy_pool(pool); + of_reserved_mem_device_release(&optee->teedev->dev); + } =20 return rc; } @@ -1833,14 +1842,14 @@ static int optee_probe(struct platform_device *pdev) (sec_caps & OPTEE_SMC_SEC_CAP_RPMB_PROBE)) optee->in_kernel_rpmb_routing =3D true; =20 - teedev =3D tee_device_alloc(&optee_clnt_desc, NULL, pool, optee); + teedev =3D tee_device_alloc(&optee_clnt_desc, &pdev->dev, pool, optee); if (IS_ERR(teedev)) { rc =3D PTR_ERR(teedev); goto err_free_optee; } optee->teedev =3D teedev; =20 - teedev =3D tee_device_alloc(&optee_supp_desc, NULL, pool, optee); + teedev =3D tee_device_alloc(&optee_supp_desc, &pdev->dev, pool, optee); if (IS_ERR(teedev)) { rc =3D PTR_ERR(teedev); goto err_unreg_teedev; diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 6742b3579c86..49a9b2993c83 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -3,6 +3,7 @@ * Copyright (c) 2015-2017, 2019-2021 Linaro Limited */ #include +#include #include #include #include @@ -43,6 +44,7 @@ static void tee_shm_release(struct tee_device *teedev, st= ruct tee_shm *shm) =20 dma_mem =3D container_of(shm, struct tee_shm_dma_mem, shm); p =3D dma_mem; + ffa_lend_reclaimed(&teedev->dev, shm->paddr, shm->size); dma_free_pages(&teedev->dev, shm->size, dma_mem->page, dma_mem->dma_addr, DMA_BIDIRECTIONAL); #endif @@ -288,6 +290,7 @@ struct tee_shm *tee_shm_alloc_dma_mem(struct tee_contex= t *ctx, struct tee_shm_dma_mem *dma_mem; dma_addr_t dma_addr; struct page *page; + int ret; =20 if (!tee_device_get(teedev)) return ERR_PTR(-EINVAL); @@ -297,9 +300,13 @@ struct tee_shm *tee_shm_alloc_dma_mem(struct tee_conte= xt *ctx, if (!page) goto err_put_teedev; =20 + ret =3D ffa_prepare_lend(&teedev->dev, page_to_phys(page), page_count * P= AGE_SIZE); + if (ret && ret !=3D -ENODEV) + goto err_free_pages; + dma_mem =3D kzalloc_obj(*dma_mem); if (!dma_mem) - goto err_free_pages; + goto err_map_pages; =20 refcount_set(&dma_mem->shm.refcount, 1); dma_mem->shm.ctx =3D ctx; @@ -313,6 +320,8 @@ struct tee_shm *tee_shm_alloc_dma_mem(struct tee_contex= t *ctx, =20 return &dma_mem->shm; =20 +err_map_pages: + ffa_lend_reclaimed(&teedev->dev, page_to_phys(page), page_count * PAGE_SI= ZE); err_free_pages: dma_free_pages(&teedev->dev, page_count * PAGE_SIZE, page, dma_addr, DMA_BIDIRECTIONAL); --=20 2.55.0.970.g62bdec98f9-goog