LoongArch: uprobes: Remove user_{en,dis}able_single_step()
authorTiezhu Yang <yangtiezhu@loongson.cn>
Wed, 14 May 2025 14:18:10 +0000 (22:18 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 14 May 2025 14:18:10 +0000 (22:18 +0800)
When executing the "perf probe" and "perf stat" test cases about some
cryptographic algorithm, the output shows that "Trace/breakpoint trap".
This is because it uses the software singlestep breakpoint for uprobes
on LoongArch, and no need to use the hardware singlestep. So just remove
the related function call to user_{en,dis}able_single_step() for uprobes
on LoongArch.

How to reproduce:

Please make sure CONFIG_UPROBE_EVENTS is set and openssl supports sm2
algorithm, then execute the following command.

cd tools/perf && make
./perf probe -x /usr/lib64/libcrypto.so BN_mod_mul_montgomery
./perf stat -e probe_libcrypto:BN_mod_mul_montgomery openssl speed sm2

Cc: stable@vger.kernel.org
Fixes: 19bc6cb64092 ("LoongArch: Add uprobes support")
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/uprobes.c

index 87abc7137b738e185a0767882ab4d92f9e7531c4..0ab9d8d631c413235efb75f1e3cc5496f480e1ae 100644 (file)
@@ -42,7 +42,6 @@ int arch_uprobe_pre_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
        utask->autask.saved_trap_nr = current->thread.trap_nr;
        current->thread.trap_nr = UPROBE_TRAP_NR;
        instruction_pointer_set(regs, utask->xol_vaddr);
-       user_enable_single_step(current);
 
        return 0;
 }
@@ -59,8 +58,6 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
        else
                instruction_pointer_set(regs, utask->vaddr + LOONGARCH_INSN_SIZE);
 
-       user_disable_single_step(current);
-
        return 0;
 }
 
@@ -70,7 +67,6 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
 
        current->thread.trap_nr = utask->autask.saved_trap_nr;
        instruction_pointer_set(regs, utask->vaddr);
-       user_disable_single_step(current);
 }
 
 bool arch_uprobe_xol_was_trapped(struct task_struct *t)