[IMPROVE] call uprobe handlers from non-atomic context (for ARM)
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 23 Dec 2015 09:18:26 +0000 (12:18 +0300)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 5 Feb 2016 09:30:54 +0000 (12:30 +0300)
Change-Id: I4facd2d7548b1bc5d9cc8d68cf0f0c8e6d60e854
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
preload/preload_probe.c
uprobe/arch/arm/swap-asm/swap_uprobes.c
uprobe/swap_uprobes.h
us_manager/sspt/sspt.h

index c7b0f44..a52b39c 100644 (file)
@@ -219,8 +219,6 @@ static void write_msg_init(struct us_ip *ip)
 
 static int write_msg_reg(struct us_ip *ip)
 {
-       ip->uprobe.atomic_ctx = false;
-
        return get_caller_register_probe(ip);
 }
 
index 861aabd..5282820 100644 (file)
@@ -936,41 +936,21 @@ static void arch_prepare_singlestep(struct uprobe *p, struct pt_regs *regs)
  * @param instr Instruction.
  * @return uprobe_handler results.
  */
-int uprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
+static int uprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
 {
        int ret = 0;
        struct uprobe *p;
-       unsigned long flags;
        unsigned long vaddr = regs->ARM_pc | !!thumb_mode(regs);
        pid_t tgid = current->tgid;
 
-       local_irq_save(flags);
-       preempt_disable();
-
        p = get_uprobe((uprobe_opcode_t *)vaddr, tgid);
        if (p) {
-               bool prepare = false;
-
-               if (p->atomic_ctx) {
-                       if (!p->pre_handler || !p->pre_handler(p, regs))
-                               prepare = true;
-               } else {
-                       swap_preempt_enable_no_resched();
-                       local_irq_restore(flags);
-
-                       if (!p->pre_handler || !p->pre_handler(p, regs))
-                               prepare = true;
-
-                       local_irq_save(flags);
-                       preempt_disable();
-               }
-
-               if (prepare)
+               if (!p->pre_handler || !p->pre_handler(p, regs))
                        arch_prepare_singlestep(p, regs);
        } else {
                ret = urp_handler(regs, tgid);
 
-               /* check ARM/THUMB mode on correct */
+               /* check ARM/THUMB CPU mode matches installed probe mode */
                if (ret) {
                        vaddr ^= 1;
                        p = get_uprobe((uprobe_opcode_t *)vaddr, tgid);
@@ -979,20 +959,11 @@ int uprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
                                       !!thumb_mode(regs), p->addr, p->opcode);
                                ret = 0;
 
-                               swap_preempt_enable_no_resched();
-                               local_irq_restore(flags);
-
                                disarm_uprobe(p, current);
-
-                               local_irq_save(flags);
-                               preempt_disable();
                        }
                }
        }
 
-       swap_preempt_enable_no_resched();
-       local_irq_restore(flags);
-
        return ret;
 }
 
index d33b9e7..c863978 100644 (file)
@@ -93,7 +93,6 @@ struct uprobe {
        struct arch_insn ainsn;              /**< Copy of the original instruction.*/
        struct task_struct *task;            /**< Pointer to the task struct */
        struct slot_manager *sm;             /**< Pointer to slot manager */
-       bool atomic_ctx;                    /**< Handler context */
 };
 
 struct uinst_info {
index 5d055e6..eadf5e5 100644 (file)
@@ -61,7 +61,6 @@ static inline int sspt_register_usprobe(struct us_ip *ip)
        up->addr = (kprobe_opcode_t *)ip->orig_addr;
        up->task = ip->page->file->proc->task;
        up->sm = ip->page->file->proc->sm;
-       up->atomic_ctx = true;
 
        ret = probe_info_register(ip->desc->type, ip);
        if (ret) {