Commit 2c749f73 authored by Youling Tang's avatar Youling Tang Committed by Huacai Chen
Browse files

LoongArch: Batch the icache maintenance for jump_label



Switch to the batched version of the jump label update functions so
instruction cache maintenance is deferred until the end of the update.

Signed-off-by: default avatarYouling Tang <tangyouling@kylinos.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent adf346e5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
#include <linux/stringify.h>
#include <asm/asm.h>

#define HAVE_JUMP_LABEL_BATCH

#define JUMP_LABEL_NOP_SIZE	4

#ifdef CONFIG_32BIT
+3 −3
Original line number Diff line number Diff line
@@ -209,6 +209,9 @@ int larch_insn_write(void *addr, u32 insn)
	int ret;
	unsigned long flags = 0;

	if ((unsigned long)addr & 3)
		return -EINVAL;

	raw_spin_lock_irqsave(&patch_lock, flags);
	ret = copy_to_kernel_nofault(addr, &insn, LOONGARCH_INSN_SIZE);
	raw_spin_unlock_irqrestore(&patch_lock, flags);
@@ -221,9 +224,6 @@ int larch_insn_patch_text(void *addr, u32 insn)
	int ret;
	u32 *tp = addr;

	if ((unsigned long)tp & 3)
		return -EINVAL;

	ret = larch_insn_write(tp, insn);
	if (!ret)
		flush_icache_range((unsigned long)tp,
+10 −2
Original line number Diff line number Diff line
@@ -6,9 +6,10 @@
 */
#include <linux/kernel.h>
#include <linux/jump_label.h>
#include <asm/cacheflush.h>
#include <asm/inst.h>

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)
{
	u32 insn;
	void *addr = (void *)jump_entry_code(entry);
@@ -18,5 +19,12 @@ void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type ty
	else
		insn = larch_insn_gen_nop();

	larch_insn_patch_text(addr, insn);
	larch_insn_write(addr, insn);

	return true;
}

void arch_jump_label_transform_apply(void)
{
	flush_icache_all();
}