lkml.org 
[lkml]   [2020]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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

    \
     
     \ /
      Last update: 2020-02-18 15:41    [W:2.105 / U:2.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site