Clean up the function to look sane:
- return immediately on error, rather than pointlessly setting the
  return value
- pr_info() instead of printk()
- check return value of patch_instruction()
- and to top it all of: a reverse christmas tree!

Signed-off-by: Naveen N. Rao <naveen.n....@linux.vnet.ibm.com>
---
 arch/powerpc/kernel/kprobes.c | 64 +++++++++++++++++------------------
 1 file changed, 31 insertions(+), 33 deletions(-)

diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index bbef9e918ecb39..7195162362941f 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -105,56 +105,54 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, 
unsigned int offset)
 
 int arch_prepare_kprobe(struct kprobe *p)
 {
-       int ret = 0;
+       struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->addr);
+       struct instruction_op op;
        struct kprobe *prev;
        struct pt_regs regs;
-       struct instruction_op op;
-       struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->addr);
+       int ret = 0;
 
        if ((unsigned long)p->addr & 0x03) {
-               printk("Attempt to register kprobe at an unaligned address\n");
-               ret = -EINVAL;
+               pr_info("Attempt to register kprobe at an unaligned address\n");
+               return -EINVAL;
        } else if (IS_MTMSRD(insn) || IS_RFID(insn)) {
-               printk("Cannot register a kprobe on mtmsr[d]/rfi[d]\n");
-               ret = -EINVAL;
+               pr_info("Cannot register a kprobe on mtmsr[d]/rfi[d]\n");
+               return -EINVAL;
        } else if ((unsigned long)p->addr & ~PAGE_MASK &&
                        ppc_inst_prefixed(ppc_inst_read((struct ppc_inst 
*)(p->addr - 1)))) {
-               printk("Cannot register a kprobe on the second word of prefixed 
instruction\n");
-               ret = -EINVAL;
+               pr_info("Cannot register a kprobe on the second word of 
prefixed instruction\n");
+               return -EINVAL;
        }
+
+       /* Check if the previous instruction is a prefix instruction with an 
active kprobe */
        preempt_disable();
        prev = get_kprobe(p->addr - 1);
        preempt_enable_no_resched();
-       if (prev &&
-           ppc_inst_prefixed(ppc_inst_read((struct ppc_inst 
*)prev->ainsn.insn))) {
-               printk("Cannot register a kprobe on the second word of prefixed 
instruction\n");
-               ret = -EINVAL;
+       if (prev && ppc_inst_prefixed(ppc_inst_read((struct ppc_inst 
*)prev->ainsn.insn))) {
+               pr_info("Cannot register a kprobe on the second word of 
prefixed instruction\n");
+               return -EINVAL;
        }
 
        /* insn must be on a special executable page on ppc64.  This is
         * not explicitly required on ppc32 (right now), but it doesn't hurt */
-       if (!ret) {
-               p->ainsn.insn = get_insn_slot();
-               if (!p->ainsn.insn)
-                       ret = -ENOMEM;
-       }
+       p->ainsn.insn = get_insn_slot();
+       if (!p->ainsn.insn)
+               return -ENOMEM;
 
-       if (!ret) {
-               patch_instruction((struct ppc_inst *)p->ainsn.insn, insn);
-               p->opcode = ppc_inst_val(insn);
-
-               /* Check if this is an instruction we recognise */
-               p->ainsn.boostable = 0;
-               memset(&regs, 0, sizeof(struct pt_regs));
-               regs.nip = (unsigned long)p->addr;
-               regs.msr = MSR_KERNEL;
-               ret = analyse_instr(&op, &regs, insn);
-               if (ret == 1 || (ret == 0 && GETTYPE(op.type) != UNKNOWN))
-                       p->ainsn.boostable = 1;
-               ret = 0;
-       }
+       if (patch_instruction((struct ppc_inst *)p->ainsn.insn, insn))
+               return -EFAULT;
 
-       return ret;
+       p->opcode = ppc_inst_val(insn);
+
+       /* Check if this is an instruction we recognise */
+       p->ainsn.boostable = 0;
+       memset(&regs, 0, sizeof(struct pt_regs));
+       regs.nip = (unsigned long)p->addr;
+       regs.msr = MSR_KERNEL;
+       ret = analyse_instr(&op, &regs, insn);
+       if (ret == 1 || (ret == 0 && GETTYPE(op.type) != UNKNOWN))
+               p->ainsn.boostable = 1;
+
+       return 0;
 }
 NOKPROBE_SYMBOL(arch_prepare_kprobe);
 
-- 
2.30.2

Reply via email to