Messages in this thread | | | Date | Tue, 18 Feb 2020 20:10:52 +0530 | From | "Naveen N. Rao" <> | Subject | Re: [PATCH 2/2] powerpc/kprobes: Reduce depth of a test |
| |
Christophe Leroy wrote: > if (a) { > if (b) > do_something(); > } > > Is equivalent to > > if (a & b) > do_something(); > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > --- > arch/powerpc/kernel/kprobes.c | 58 +++++++++++++++++------------------ > 1 file changed, 28 insertions(+), 30 deletions(-) > > diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c > index 7a925eb76ec0..d7c80a078c1e 100644 > --- a/arch/powerpc/kernel/kprobes.c > +++ b/arch/powerpc/kernel/kprobes.c > @@ -277,38 +277,36 @@ int kprobe_handler(struct pt_regs *regs) > > /* Check we're not actually recursing */ > p = get_kprobe(addr); > - if (kprobe_running()) { > - if (p) { > - kprobe_opcode_t insn = *p->ainsn.insn; > - if (kcb->kprobe_status == KPROBE_HIT_SS && > - is_trap(insn)) { > - /* Turn off 'trace' bits */ > - regs->msr &= ~MSR_SINGLESTEP; > - regs->msr |= kcb->kprobe_saved_msr; > - goto no_kprobe; > - } > - /* We have reentered the kprobe_handler(), since > - * another probe was hit while within the handler. > - * We here save the original kprobes variables and > - * just single step on the instruction of the new probe > - * without calling any user handlers. > - */ > - save_previous_kprobe(kcb); > - set_current_kprobe(p, regs, kcb); > - kprobes_inc_nmissed_count(p); > - kcb->kprobe_status = KPROBE_REENTER; > - if (p->ainsn.boostable >= 0) { > - ret = try_to_emulate(p, regs); > - > - if (ret > 0) { > - restore_previous_kprobe(kcb); > - preempt_enable_no_resched(); > - return 1; > - } > + if (kprobe_running() && p) { > + kprobe_opcode_t insn = *p->ainsn.insn; > + > + if (kcb->kprobe_status == KPROBE_HIT_SS && is_trap(insn)) { > + /* Turn off 'trace' bits */ > + regs->msr &= ~MSR_SINGLESTEP; > + regs->msr |= kcb->kprobe_saved_msr; > + goto no_kprobe; > + } > + /* We have reentered the kprobe_handler(), since > + * another probe was hit while within the handler. > + * We here save the original kprobes variables and > + * just single step on the instruction of the new probe > + * without calling any user handlers. > + */ > + save_previous_kprobe(kcb); > + set_current_kprobe(p, regs, kcb); > + kprobes_inc_nmissed_count(p); > + kcb->kprobe_status = KPROBE_REENTER; > + if (p->ainsn.boostable >= 0) { > + ret = try_to_emulate(p, regs); > + > + if (ret > 0) { > + restore_previous_kprobe(kcb); > + preempt_enable_no_resched(); > + return 1; > } > - prepare_singlestep(p, regs); > - return 1; > } > + prepare_singlestep(p, regs); > + return 1; > } >
If we move the below !p case before the check for kprobe_running() right after get_kprobe(), we won't need to check for (p) above and we won't have any change in logic from Patch 1.
> if (!p) {
- Naveen
| |