[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1582036273.gp0i4o7fv2.naveen@linux.ibm.com>
Date: Tue, 18 Feb 2020 20:10:52 +0530
From: "Naveen N. Rao" <naveen.n.rao@...ux.vnet.ibm.com>
To: Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Christophe Leroy <christophe.leroy@....fr>,
Michael Ellerman <mpe@...erman.id.au>,
Paul Mackerras <paulus@...ba.org>
Cc: linux-kernel@...r.kernel.org, linuxppc-dev@...ts.ozlabs.org
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@....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
Powered by blists - more mailing lists