]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
riscv: jump_label: Batch icache maintenance
authorSamuel Holland <samuel.holland@sifive.com>
Wed, 27 Mar 2024 16:04:40 +0000 (09:04 -0700)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 26 Jun 2024 14:36:27 +0000 (07:36 -0700)
Switch to the batched version of the jump label update functions so
instruction cache maintenance is deferred until the end of the update.

Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Link: https://lore.kernel.org/r/20240327160520.791322-2-samuel.holland@sifive.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/include/asm/jump_label.h
arch/riscv/kernel/jump_label.c

index 4a35d787c0191475b3a5d8dc7452e448541dc8e9..6290b26f4a148089164e9a598841a9bff35565f3 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/types.h>
 #include <asm/asm.h>
 
+#define HAVE_JUMP_LABEL_BATCH
+
 #define JUMP_LABEL_NOP_SIZE 4
 
 static __always_inline bool arch_static_branch(struct static_key * const key,
index e6694759dbd010f9d8b98a31d854a19a3491e10a..11ad789c60c6984600b36c1089e01f819f8228c8 100644 (file)
@@ -9,13 +9,14 @@
 #include <linux/memory.h>
 #include <linux/mutex.h>
 #include <asm/bug.h>
+#include <asm/cacheflush.h>
 #include <asm/patch.h>
 
 #define RISCV_INSN_NOP 0x00000013U
 #define RISCV_INSN_JAL 0x0000006fU
 
-void arch_jump_label_transform(struct jump_entry *entry,
-                              enum jump_label_type type)
+bool arch_jump_label_transform_queue(struct jump_entry *entry,
+                                    enum jump_label_type type)
 {
        void *addr = (void *)jump_entry_code(entry);
        u32 insn;
@@ -24,7 +25,7 @@ void arch_jump_label_transform(struct jump_entry *entry,
                long offset = jump_entry_target(entry) - jump_entry_code(entry);
 
                if (WARN_ON(offset & 1 || offset < -524288 || offset >= 524288))
-                       return;
+                       return true;
 
                insn = RISCV_INSN_JAL |
                        (((u32)offset & GENMASK(19, 12)) << (12 - 12)) |
@@ -36,6 +37,13 @@ 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);
+
+       return true;
+}
+
+void arch_jump_label_transform_apply(void)
+{
+       flush_icache_all();
 }