arch_check_optimized_kprobe() checks each byte of the optimized range with a separate get_kprobe() lookup. Iterate over registered probes in the range instead, retaining the check for probes that are still armed. Signed-off-by: Jiri Olsa --- arch/x86/kernel/kprobes/opt.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 9da41424be77..cdf69c939631 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -334,12 +334,13 @@ static int can_optimize(unsigned long paddr) /* Check optimized_kprobe can actually be optimized. */ int arch_check_optimized_kprobe(struct optimized_kprobe *op) { - int i; + unsigned long start = (unsigned long)op->kp.addr; + unsigned long end = start + op->optinsn.size - 1; + struct kprobe_iter iter; struct kprobe *p; - for (i = 1; i < op->optinsn.size; i++) { - p = get_kprobe(op->kp.addr + i); - if (p && !kprobe_disarmed(p)) + for_each_kprobe(iter, p, start + 1, end) { + if (!kprobe_disarmed(p)) return -EEXIST; } -- 2.43.0