* [PATCH] riscv: patch: Remove redundant functions
@ 2024-07-17 8:41 Alexandre Ghiti
2024-07-17 13:15 ` Andrew Jones
2024-07-19 1:55 ` Samuel Holland
0 siblings, 2 replies; 4+ messages in thread
From: Alexandre Ghiti @ 2024-07-17 8:41 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Samuel Holland,
Peter Zijlstra, Josh Poimboeuf, Jason Baron, Steven Rostedt,
Ard Biesheuvel, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
Hao Luo, Jiri Olsa, Björn Töpel, Pu Lehui,
Puranjay Mohan, Luke Nelson, Xi Wang, linux-riscv, linux-kernel,
bpf
Cc: Alexandre Ghiti, Geert Uytterhoeven
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.
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;
--
2.39.2
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] riscv: patch: Remove redundant functions 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 1 sibling, 0 replies; 4+ messages in thread From: Andrew Jones @ 2024-07-17 13:15 UTC (permalink / raw) To: Alexandre Ghiti Cc: Paul Walmsley, Palmer Dabbelt, Albert Ou, Samuel Holland, Peter Zijlstra, Josh Poimboeuf, Jason Baron, Steven Rostedt, Ard Biesheuvel, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Björn Töpel, Pu Lehui, Puranjay Mohan, Luke Nelson, Xi Wang, linux-riscv, linux-kernel, bpf, Geert Uytterhoeven On Wed, Jul 17, 2024 at 10:41:02AM GMT, 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. > > 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(-) > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] riscv: patch: Remove redundant functions 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 2024-07-19 12:10 ` Alexandre Ghiti 1 sibling, 1 reply; 4+ messages in thread From: Samuel Holland @ 2024-07-19 1:55 UTC (permalink / raw) To: Alexandre Ghiti Cc: Geert Uytterhoeven, Paul Walmsley, Palmer Dabbelt, Albert Ou, Peter Zijlstra, Josh Poimboeuf, Jason Baron, Steven Rostedt, Ard Biesheuvel, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Björn Töpel, Pu Lehui, Puranjay Mohan, Luke Nelson, Xi Wang, linux-riscv, linux-kernel, bpf 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 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] riscv: patch: Remove redundant functions 2024-07-19 1:55 ` Samuel Holland @ 2024-07-19 12:10 ` Alexandre Ghiti 0 siblings, 0 replies; 4+ messages in thread From: Alexandre Ghiti @ 2024-07-19 12:10 UTC (permalink / raw) To: Samuel Holland Cc: Geert Uytterhoeven, Paul Walmsley, Palmer Dabbelt, Albert Ou, Peter Zijlstra, Josh Poimboeuf, Jason Baron, Steven Rostedt, Ard Biesheuvel, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Björn Töpel, Pu Lehui, Puranjay Mohan, Luke Nelson, Xi Wang, linux-riscv, linux-kernel, bpf On Fri, Jul 19, 2024 at 3:56 AM Samuel Holland <samuel.holland@sifive.com> wrote: > > 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. Ouch, thanks for catching this, I agree the global icache flush should not have been removed. I'll fix that right now, Thanks, Alex > > 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 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-07-19 12:12 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 2024-07-19 12:10 ` Alexandre Ghiti
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox