From nobody Wed Sep 17 15:42:35 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63521C4332F for ; Sat, 17 Dec 2022 18:58:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230398AbiLQS6H (ORCPT ); Sat, 17 Dec 2022 13:58:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230095AbiLQSzk (ORCPT ); Sat, 17 Dec 2022 13:55:40 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D8E1EA5; Sat, 17 Dec 2022 10:55:39 -0800 (PST) Date: Sat, 17 Dec 2022 18:55:34 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1671303335; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Lmfx9TaKwucBMraBqPgnYJf4ArYgGuYoDdRiIwbO+pM=; b=Hcbs8CeAjNXzYBUa1u2W+eObjom22DdOQsbCe4+OOllTl0ioLq8Q+f8XibbgKHU59xKgu0 0nrRcxqFI597y9veEAS/ykvZH34KwkvpvMVt1MLScdEqdMtAHju8bnbgLqwqAdWtQMShAr bFBxznmCV/3aXSQjiHKBPgcOasEDX9DEiJ+olEEAKZUuoUCv9vXXybGIEUB7LqoE4u9frn Q5o1SRoCzVlTeLBvs7ciKKM9UXX0K3CCh7QxabxuOJh3NpUEfIQdDt3nVcoiV3Mnbm7o4b JUSj1Hjflwc7ABj83wxQURDQdx/eDo2Ud+Q6GnnU2eZrYKQtmLFFgIJv/EWX+g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1671303335; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Lmfx9TaKwucBMraBqPgnYJf4ArYgGuYoDdRiIwbO+pM=; b=r17rcXZz2cua7n7Boub5Qjz7G+Tm82+elgnZhnYKKDItgx+kSoGyHltMFt4gAeFHc6jeXf LESaDOrZIRKLNRCQ== From: "tip-bot2 for Peter Zijlstra" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/mm] mm: Introduce set_memory_rox() Cc: Linus Torvalds , "Peter Zijlstra (Intel)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: References: MIME-Version: 1.0 Message-ID: <167130333462.4906.14216216509042628982.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/mm branch of tip: Commit-ID: d48567c9a0d1e605639f8a8705a61bbb55fb4e84 Gitweb: https://git.kernel.org/tip/d48567c9a0d1e605639f8a8705a61bbb5= 5fb4e84 Author: Peter Zijlstra AuthorDate: Wed, 26 Oct 2022 12:13:03 +02:00 Committer: Dave Hansen CommitterDate: Thu, 15 Dec 2022 10:37:26 -08:00 mm: Introduce set_memory_rox() Because endlessly repeating: set_memory_ro() set_memory_x() is getting tedious. Suggested-by: Linus Torvalds Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/Y1jek64pXOsougmz@hirez.programming.kicks-as= s.net --- arch/arm/mach-omap1/sram-init.c | 8 +++----- arch/arm/mach-omap2/sram.c | 8 +++----- arch/powerpc/kernel/kprobes.c | 9 ++++----- arch/x86/kernel/ftrace.c | 5 ++--- arch/x86/kernel/kprobes/core.c | 9 ++------- drivers/misc/sram-exec.c | 7 ++----- include/linux/filter.h | 3 +-- include/linux/set_memory.h | 8 ++++++++ kernel/bpf/bpf_struct_ops.c | 3 +-- kernel/bpf/core.c | 6 ++---- kernel/bpf/trampoline.c | 3 +-- net/bpf/bpf_dummy_struct_ops.c | 3 +-- 12 files changed, 30 insertions(+), 42 deletions(-) diff --git a/arch/arm/mach-omap1/sram-init.c b/arch/arm/mach-omap1/sram-ini= t.c index 27c42e2..dabf0c4 100644 --- a/arch/arm/mach-omap1/sram-init.c +++ b/arch/arm/mach-omap1/sram-init.c @@ -10,11 +10,11 @@ #include #include #include +#include =20 #include #include #include -#include =20 #include =20 @@ -74,8 +74,7 @@ void *omap_sram_push(void *funcp, unsigned long size) =20 dst =3D fncpy(sram, funcp, size); =20 - set_memory_ro(base, pages); - set_memory_x(base, pages); + set_memory_rox(base, pages); =20 return dst; } @@ -126,8 +125,7 @@ static void __init omap_detect_and_map_sram(void) base =3D (unsigned long)omap_sram_base; pages =3D PAGE_ALIGN(omap_sram_size) / PAGE_SIZE; =20 - set_memory_ro(base, pages); - set_memory_x(base, pages); + set_memory_rox(base, pages); } =20 static void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl); diff --git a/arch/arm/mach-omap2/sram.c b/arch/arm/mach-omap2/sram.c index 39cf270..815d390 100644 --- a/arch/arm/mach-omap2/sram.c +++ b/arch/arm/mach-omap2/sram.c @@ -14,11 +14,11 @@ #include #include #include +#include =20 #include #include #include -#include =20 #include =20 @@ -96,8 +96,7 @@ void *omap_sram_push(void *funcp, unsigned long size) =20 dst =3D fncpy(sram, funcp, size); =20 - set_memory_ro(base, pages); - set_memory_x(base, pages); + set_memory_rox(base, pages); =20 return dst; } @@ -217,8 +216,7 @@ static void __init omap2_map_sram(void) base =3D (unsigned long)omap_sram_base; pages =3D PAGE_ALIGN(omap_sram_size) / PAGE_SIZE; =20 - set_memory_ro(base, pages); - set_memory_x(base, pages); + set_memory_rox(base, pages); } =20 static void (*_omap2_sram_ddr_init)(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index bd7b1a0..7a89de3 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c @@ -20,12 +20,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include =20 DEFINE_PER_CPU(struct kprobe *, current_kprobe) =3D NULL; @@ -134,10 +134,9 @@ void *alloc_insn_page(void) if (!page) return NULL; =20 - if (strict_module_rwx_enabled()) { - set_memory_ro((unsigned long)page, 1); - set_memory_x((unsigned long)page, 1); - } + if (strict_module_rwx_enabled()) + set_memory_rox((unsigned long)page, 1); + return page; } =20 diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 43628b8..0357946 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -24,10 +24,10 @@ #include #include #include +#include =20 #include =20 -#include #include #include #include @@ -415,8 +415,7 @@ create_trampoline(struct ftrace_ops *ops, unsigned int = *tramp_size) =20 set_vm_flush_reset_perms(trampoline); =20 - set_memory_ro((unsigned long)trampoline, npages); - set_memory_x((unsigned long)trampoline, npages); + set_memory_rox((unsigned long)trampoline, npages); return (unsigned long)trampoline; fail: tramp_free(trampoline); diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index eb8bc82..e7b7ca6 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -43,6 +43,7 @@ #include #include #include +#include =20 #include #include @@ -51,7 +52,6 @@ #include #include #include -#include #include =20 #include "common.h" @@ -415,17 +415,12 @@ void *alloc_insn_page(void) return NULL; =20 set_vm_flush_reset_perms(page); - /* - * First make the page read-only, and only then make it executable to - * prevent it from being W+X in between. - */ - set_memory_ro((unsigned long)page, 1); =20 /* * TODO: Once additional kernel code protection mechanisms are set, ensure * that the page was not maliciously altered and it is still zeroed. */ - set_memory_x((unsigned long)page, 1); + set_memory_rox((unsigned long)page, 1); =20 return page; } diff --git a/drivers/misc/sram-exec.c b/drivers/misc/sram-exec.c index a948e95..b71dbbd 100644 --- a/drivers/misc/sram-exec.c +++ b/drivers/misc/sram-exec.c @@ -10,9 +10,9 @@ #include #include #include +#include =20 #include -#include =20 #include "sram.h" =20 @@ -106,10 +106,7 @@ void *sram_exec_copy(struct gen_pool *pool, void *dst,= void *src, =20 dst_cpy =3D fncpy(dst, src, size); =20 - ret =3D set_memory_ro((unsigned long)base, pages); - if (ret) - goto error_out; - ret =3D set_memory_x((unsigned long)base, pages); + ret =3D set_memory_rox((unsigned long)base, pages); if (ret) goto error_out; =20 diff --git a/include/linux/filter.h b/include/linux/filter.h index efc42a6..f0b17af 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -860,8 +860,7 @@ static inline void bpf_prog_lock_ro(struct bpf_prog *fp) static inline void bpf_jit_binary_lock_ro(struct bpf_binary_header *hdr) { set_vm_flush_reset_perms(hdr); - set_memory_ro((unsigned long)hdr, hdr->size >> PAGE_SHIFT); - set_memory_x((unsigned long)hdr, hdr->size >> PAGE_SHIFT); + set_memory_rox((unsigned long)hdr, hdr->size >> PAGE_SHIFT); } =20 int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int = cap); diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h index 369769c..023ebc6 100644 --- a/include/linux/set_memory.h +++ b/include/linux/set_memory.h @@ -14,6 +14,14 @@ static inline int set_memory_x(unsigned long addr, int = numpages) { return 0; } static inline int set_memory_nx(unsigned long addr, int numpages) { return= 0; } #endif =20 +static inline int set_memory_rox(unsigned long addr, int numpages) +{ + int ret =3D set_memory_ro(addr, numpages); + if (ret) + return ret; + return set_memory_x(addr, numpages); +} + #ifndef CONFIG_ARCH_HAS_SET_DIRECT_MAP static inline int set_direct_map_invalid_noflush(struct page *page) { diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c index 84b2d9d..ece9870 100644 --- a/kernel/bpf/bpf_struct_ops.c +++ b/kernel/bpf/bpf_struct_ops.c @@ -494,8 +494,7 @@ static int bpf_struct_ops_map_update_elem(struct bpf_ma= p *map, void *key, refcount_set(&kvalue->refcnt, 1); bpf_map_inc(map); =20 - set_memory_ro((long)st_map->image, 1); - set_memory_x((long)st_map->image, 1); + set_memory_rox((long)st_map->image, 1); err =3D st_ops->reg(kdata); if (likely(!err)) { /* Pair with smp_load_acquire() during lookup_elem(). diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 25a54e0..b0525ea 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -864,8 +864,7 @@ static struct bpf_prog_pack *alloc_new_pack(bpf_jit_fil= l_hole_t bpf_fill_ill_ins list_add_tail(&pack->list, &pack_list); =20 set_vm_flush_reset_perms(pack->ptr); - set_memory_ro((unsigned long)pack->ptr, BPF_PROG_PACK_SIZE / PAGE_SIZE); - set_memory_x((unsigned long)pack->ptr, BPF_PROG_PACK_SIZE / PAGE_SIZE); + set_memory_rox((unsigned long)pack->ptr, BPF_PROG_PACK_SIZE / PAGE_SIZE); return pack; } =20 @@ -883,8 +882,7 @@ void *bpf_prog_pack_alloc(u32 size, bpf_jit_fill_hole_t= bpf_fill_ill_insns) if (ptr) { bpf_fill_ill_insns(ptr, size); set_vm_flush_reset_perms(ptr); - set_memory_ro((unsigned long)ptr, size / PAGE_SIZE); - set_memory_x((unsigned long)ptr, size / PAGE_SIZE); + set_memory_rox((unsigned long)ptr, size / PAGE_SIZE); } goto out; } diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c index bf0906e..a848922 100644 --- a/kernel/bpf/trampoline.c +++ b/kernel/bpf/trampoline.c @@ -468,8 +468,7 @@ again: if (err < 0) goto out; =20 - set_memory_ro((long)im->image, 1); - set_memory_x((long)im->image, 1); + set_memory_rox((long)im->image, 1); =20 WARN_ON(tr->cur_image && tr->selector =3D=3D 0); WARN_ON(!tr->cur_image && tr->selector); diff --git a/net/bpf/bpf_dummy_struct_ops.c b/net/bpf/bpf_dummy_struct_ops.c index e78dadf..9ff3232 100644 --- a/net/bpf/bpf_dummy_struct_ops.c +++ b/net/bpf/bpf_dummy_struct_ops.c @@ -124,8 +124,7 @@ int bpf_struct_ops_test_run(struct bpf_prog *prog, cons= t union bpf_attr *kattr, if (err < 0) goto out; =20 - set_memory_ro((long)image, 1); - set_memory_x((long)image, 1); + set_memory_rox((long)image, 1); prog_ret =3D dummy_ops_call_op(image, args); =20 err =3D dummy_ops_copy_args(args);