uprobes/x86: Optimize is_optimize()

Make is_optimized() return a tri-state and avoid return through
argument. This simplifies things a little.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20250821123656.823296198@infradead.org
This commit is contained in:
Peter Zijlstra 2025-08-20 12:37:22 +02:00
parent 985e820b72
commit fd54052b60
1 changed files with 13 additions and 21 deletions

View File

@ -1047,7 +1047,7 @@ static bool __is_optimized(uprobe_opcode_t *insn, unsigned long vaddr)
return __in_uprobe_trampoline(vaddr + 5 + call->raddr); return __in_uprobe_trampoline(vaddr + 5 + call->raddr);
} }
static int is_optimized(struct mm_struct *mm, unsigned long vaddr, bool *optimized) static int is_optimized(struct mm_struct *mm, unsigned long vaddr)
{ {
uprobe_opcode_t insn[5]; uprobe_opcode_t insn[5];
int err; int err;
@ -1055,8 +1055,7 @@ static int is_optimized(struct mm_struct *mm, unsigned long vaddr, bool *optimiz
err = copy_from_vaddr(mm, vaddr, &insn, 5); err = copy_from_vaddr(mm, vaddr, &insn, 5);
if (err) if (err)
return err; return err;
*optimized = __is_optimized((uprobe_opcode_t *)&insn, vaddr); return __is_optimized((uprobe_opcode_t *)&insn, vaddr);
return 0;
} }
static bool should_optimize(struct arch_uprobe *auprobe) static bool should_optimize(struct arch_uprobe *auprobe)
@ -1069,17 +1068,14 @@ int set_swbp(struct arch_uprobe *auprobe, struct vm_area_struct *vma,
unsigned long vaddr) unsigned long vaddr)
{ {
if (should_optimize(auprobe)) { if (should_optimize(auprobe)) {
bool optimized = false;
int err;
/* /*
* We could race with another thread that already optimized the probe, * We could race with another thread that already optimized the probe,
* so let's not overwrite it with int3 again in this case. * so let's not overwrite it with int3 again in this case.
*/ */
err = is_optimized(vma->vm_mm, vaddr, &optimized); int ret = is_optimized(vma->vm_mm, vaddr);
if (err) if (ret < 0)
return err; return ret;
if (optimized) if (ret)
return 0; return 0;
} }
return uprobe_write_opcode(auprobe, vma, vaddr, UPROBE_SWBP_INSN, return uprobe_write_opcode(auprobe, vma, vaddr, UPROBE_SWBP_INSN,
@ -1090,17 +1086,13 @@ int set_orig_insn(struct arch_uprobe *auprobe, struct vm_area_struct *vma,
unsigned long vaddr) unsigned long vaddr)
{ {
if (test_bit(ARCH_UPROBE_FLAG_CAN_OPTIMIZE, &auprobe->flags)) { if (test_bit(ARCH_UPROBE_FLAG_CAN_OPTIMIZE, &auprobe->flags)) {
struct mm_struct *mm = vma->vm_mm; int ret = is_optimized(vma->vm_mm, vaddr);
bool optimized = false; if (ret < 0)
int err; return ret;
if (ret) {
err = is_optimized(mm, vaddr, &optimized); ret = swbp_unoptimize(auprobe, vma, vaddr);
if (err) WARN_ON_ONCE(ret);
return err; return ret;
if (optimized) {
err = swbp_unoptimize(auprobe, vma, vaddr);
WARN_ON_ONCE(err);
return err;
} }
} }
return uprobe_write_opcode(auprobe, vma, vaddr, *(uprobe_opcode_t *)&auprobe->insn, return uprobe_write_opcode(auprobe, vma, vaddr, *(uprobe_opcode_t *)&auprobe->insn,