From: Samuel Holland <samuel.holland@sifive.com>
To: Alexandre Ghiti <alexghiti@rivosinc.com>
Cc: "Geert Uytterhoeven" <geert@linux-m68k.org>,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Peter Zijlstra" <peterz@infradead.org>,
"Josh Poimboeuf" <jpoimboe@kernel.org>,
"Jason Baron" <jbaron@akamai.com>,
"Steven Rostedt" <rostedt@goodmis.org>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Alexei Starovoitov" <ast@kernel.org>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Andrii Nakryiko" <andrii@kernel.org>,
"Martin KaFai Lau" <martin.lau@linux.dev>,
"Eduard Zingerman" <eddyz87@gmail.com>,
"Song Liu" <song@kernel.org>,
"Yonghong Song" <yonghong.song@linux.dev>,
"John Fastabend" <john.fastabend@gmail.com>,
"KP Singh" <kpsingh@kernel.org>,
"Stanislav Fomichev" <sdf@fomichev.me>,
"Hao Luo" <haoluo@google.com>, "Jiri Olsa" <jolsa@kernel.org>,
"Björn Töpel" <bjorn@kernel.org>, "Pu Lehui" <pulehui@huawei.com>,
"Puranjay Mohan" <puranjay@kernel.org>,
"Luke Nelson" <luke.r.nels@gmail.com>,
"Xi Wang" <xi.wang@gmail.com>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
bpf@vger.kernel.org
Subject: Re: [PATCH] riscv: patch: Remove redundant functions
Date: Thu, 18 Jul 2024 20:55:58 -0500 [thread overview]
Message-ID: <a28ddc26-d77a-470a-a33f-88144f717e86@sifive.com> (raw)
In-Reply-To: <20240717084102.150914-1-alexghiti@rivosinc.com>
Hi Alex,
On 2024-07-17 3:41 AM, Alexandre Ghiti wrote:
> Commit edf2d546bfd6f5c4 ("riscv: patch: Flush the icache right after
> patching to avoid illegal insns") removed the last differences between
> patch_text_set_nosync() and patch_insn_set(), and between
> patch_text_nosync() and patch_insn_write().
>
> So remove the redundant *_nosync() functions.
My understanding was that we would eventually revert that patch, once we are
sure we never non-atomically patch the text patching code. So it's helpful to
keep the semantic distinction between the two sets of functions.
And looking at this closer, I think the original patch should not have removed
the calls to flush_icache_range() anyway. It replaces a global icache flush with
a local icache flush, which is wrong if there is more than one CPU online, and
there are a couple of places (bpf_jit_core.c, kprobes.c) where those functions
are called at runtime.
Regards,
Samuel
> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Closes: https://lore.kernel.org/linux-riscv/CAMuHMdUwx=rU2MWhFTE6KhYHm64phxx2Y6u05-aBLGfeG5696A@mail.gmail.com/
> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
> ---
> arch/riscv/errata/sifive/errata.c | 4 ++--
> arch/riscv/errata/thead/errata.c | 2 +-
> arch/riscv/include/asm/patch.h | 3 +--
> arch/riscv/kernel/alternative.c | 4 ++--
> arch/riscv/kernel/cpufeature.c | 2 +-
> arch/riscv/kernel/jump_label.c | 2 +-
> arch/riscv/kernel/patch.c | 24 +-----------------------
> arch/riscv/net/bpf_jit_core.c | 4 ++--
> 8 files changed, 11 insertions(+), 34 deletions(-)
>
> diff --git a/arch/riscv/errata/sifive/errata.c b/arch/riscv/errata/sifive/errata.c
> index 716cfedad3a2..5253b205aa17 100644
> --- a/arch/riscv/errata/sifive/errata.c
> +++ b/arch/riscv/errata/sifive/errata.c
> @@ -112,8 +112,8 @@ void sifive_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
> tmp = (1U << alt->patch_id);
> if (cpu_req_errata & tmp) {
> mutex_lock(&text_mutex);
> - patch_text_nosync(ALT_OLD_PTR(alt), ALT_ALT_PTR(alt),
> - alt->alt_len);
> + patch_insn_write(ALT_OLD_PTR(alt), ALT_ALT_PTR(alt),
> + alt->alt_len);
> mutex_unlock(&text_mutex);
> cpu_apply_errata |= tmp;
> }
> diff --git a/arch/riscv/errata/thead/errata.c b/arch/riscv/errata/thead/errata.c
> index bf6a0a6318ee..0ce280a190b6 100644
> --- a/arch/riscv/errata/thead/errata.c
> +++ b/arch/riscv/errata/thead/errata.c
> @@ -182,7 +182,7 @@ void thead_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
> memcpy(oldptr, altptr, alt->alt_len);
> } else {
> mutex_lock(&text_mutex);
> - patch_text_nosync(oldptr, altptr, alt->alt_len);
> + patch_insn_write(oldptr, altptr, alt->alt_len);
> mutex_unlock(&text_mutex);
> }
> }
> diff --git a/arch/riscv/include/asm/patch.h b/arch/riscv/include/asm/patch.h
> index 9f5d6e14c405..6b0e9b8a321b 100644
> --- a/arch/riscv/include/asm/patch.h
> +++ b/arch/riscv/include/asm/patch.h
> @@ -6,9 +6,8 @@
> #ifndef _ASM_RISCV_PATCH_H
> #define _ASM_RISCV_PATCH_H
>
> +int patch_insn_set(void *addr, u8 c, size_t len);
> int patch_insn_write(void *addr, const void *insn, size_t len);
> -int patch_text_nosync(void *addr, const void *insns, size_t len);
> -int patch_text_set_nosync(void *addr, u8 c, size_t len);
> int patch_text(void *addr, u32 *insns, int ninsns);
>
> extern int riscv_patch_in_stop_machine;
> diff --git a/arch/riscv/kernel/alternative.c b/arch/riscv/kernel/alternative.c
> index 0128b161bfda..a8b508d99cf8 100644
> --- a/arch/riscv/kernel/alternative.c
> +++ b/arch/riscv/kernel/alternative.c
> @@ -83,7 +83,7 @@ static void riscv_alternative_fix_auipc_jalr(void *ptr, u32 auipc_insn,
> riscv_insn_insert_utype_itype_imm(&call[0], &call[1], imm);
>
> /* patch the call place again */
> - patch_text_nosync(ptr, call, sizeof(u32) * 2);
> + patch_insn_write(ptr, call, sizeof(u32) * 2);
> }
>
> static void riscv_alternative_fix_jal(void *ptr, u32 jal_insn, int patch_offset)
> @@ -98,7 +98,7 @@ static void riscv_alternative_fix_jal(void *ptr, u32 jal_insn, int patch_offset)
> riscv_insn_insert_jtype_imm(&jal_insn, imm);
>
> /* patch the call place again */
> - patch_text_nosync(ptr, &jal_insn, sizeof(u32));
> + patch_insn_write(ptr, &jal_insn, sizeof(u32));
> }
>
> void riscv_alternative_fix_offsets(void *alt_ptr, unsigned int len,
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index 5ef48cb20ee1..4c040a857c7e 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -795,7 +795,7 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> altptr = ALT_ALT_PTR(alt);
>
> mutex_lock(&text_mutex);
> - patch_text_nosync(oldptr, altptr, alt->alt_len);
> + patch_insn_write(oldptr, altptr, alt->alt_len);
> riscv_alternative_fix_offsets(oldptr, alt->alt_len, oldptr - altptr);
> mutex_unlock(&text_mutex);
> }
> diff --git a/arch/riscv/kernel/jump_label.c b/arch/riscv/kernel/jump_label.c
> index e6694759dbd0..74b5ebfacf4a 100644
> --- a/arch/riscv/kernel/jump_label.c
> +++ b/arch/riscv/kernel/jump_label.c
> @@ -36,6 +36,6 @@ void arch_jump_label_transform(struct jump_entry *entry,
> }
>
> mutex_lock(&text_mutex);
> - patch_text_nosync(addr, &insn, sizeof(insn));
> + patch_insn_write(addr, &insn, sizeof(insn));
> mutex_unlock(&text_mutex);
> }
> diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c
> index ab03732d06c4..bf45b507f900 100644
> --- a/arch/riscv/kernel/patch.c
> +++ b/arch/riscv/kernel/patch.c
> @@ -177,7 +177,7 @@ static int __patch_insn_write(void *addr, const void *insn, size_t len)
> NOKPROBE_SYMBOL(__patch_insn_write);
> #endif /* CONFIG_MMU */
>
> -static int patch_insn_set(void *addr, u8 c, size_t len)
> +int patch_insn_set(void *addr, u8 c, size_t len)
> {
> size_t patched = 0;
> size_t size;
> @@ -198,17 +198,6 @@ static int patch_insn_set(void *addr, u8 c, size_t len)
> }
> NOKPROBE_SYMBOL(patch_insn_set);
>
> -int patch_text_set_nosync(void *addr, u8 c, size_t len)
> -{
> - u32 *tp = addr;
> - int ret;
> -
> - ret = patch_insn_set(tp, c, len);
> -
> - return ret;
> -}
> -NOKPROBE_SYMBOL(patch_text_set_nosync);
> -
> int patch_insn_write(void *addr, const void *insn, size_t len)
> {
> size_t patched = 0;
> @@ -230,17 +219,6 @@ int patch_insn_write(void *addr, const void *insn, size_t len)
> }
> NOKPROBE_SYMBOL(patch_insn_write);
>
> -int patch_text_nosync(void *addr, const void *insns, size_t len)
> -{
> - u32 *tp = addr;
> - int ret;
> -
> - ret = patch_insn_write(tp, insns, len);
> -
> - return ret;
> -}
> -NOKPROBE_SYMBOL(patch_text_nosync);
> -
> static int patch_text_cb(void *data)
> {
> struct patch_insn *patch = data;
> diff --git a/arch/riscv/net/bpf_jit_core.c b/arch/riscv/net/bpf_jit_core.c
> index 0a96abdaca65..b053ae5c4191 100644
> --- a/arch/riscv/net/bpf_jit_core.c
> +++ b/arch/riscv/net/bpf_jit_core.c
> @@ -226,7 +226,7 @@ void *bpf_arch_text_copy(void *dst, void *src, size_t len)
> int ret;
>
> mutex_lock(&text_mutex);
> - ret = patch_text_nosync(dst, src, len);
> + ret = patch_insn_write(dst, src, len);
> mutex_unlock(&text_mutex);
>
> if (ret)
> @@ -240,7 +240,7 @@ int bpf_arch_text_invalidate(void *dst, size_t len)
> int ret;
>
> mutex_lock(&text_mutex);
> - ret = patch_text_set_nosync(dst, 0, len);
> + ret = patch_insn_set(dst, 0, len);
> mutex_unlock(&text_mutex);
>
> return ret;
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2024-07-19 1:56 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-17 8:41 [PATCH] riscv: patch: Remove redundant functions Alexandre Ghiti
2024-07-17 13:15 ` Andrew Jones
2024-07-19 1:55 ` Samuel Holland [this message]
2024-07-19 12:10 ` Alexandre Ghiti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a28ddc26-d77a-470a-a33f-88144f717e86@sifive.com \
--to=samuel.holland@sifive.com \
--cc=alexghiti@rivosinc.com \
--cc=andrii@kernel.org \
--cc=aou@eecs.berkeley.edu \
--cc=ardb@kernel.org \
--cc=ast@kernel.org \
--cc=bjorn@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=geert@linux-m68k.org \
--cc=haoluo@google.com \
--cc=jbaron@akamai.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=luke.r.nels@gmail.com \
--cc=martin.lau@linux.dev \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=peterz@infradead.org \
--cc=pulehui@huawei.com \
--cc=puranjay@kernel.org \
--cc=rostedt@goodmis.org \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=xi.wang@gmail.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox