[REFACTOR] remove field 'tgid' from 'struct kprobe'
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 2 Apr 2013 09:51:42 +0000 (13:51 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 2 Apr 2013 09:51:42 +0000 (13:51 +0400)
driver/us_proc_inst.c
kprobe/arch/asm-arm/dbi_kprobes.c
kprobe/dbi_kprobes.c
kprobe/dbi_kprobes.h
uprobe/swap_uprobes.c

index ac72863..08c6533 100644 (file)
@@ -1217,7 +1217,6 @@ int uretprobe_event_handler(struct uretprobe_instance *probe, struct pt_regs *re
 int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic)
 {
        int ret = 0;
-       ip->jprobe.up.kp.tgid = task->tgid;
 
        if (ip->jprobe.entry == NULL) {
                ip->jprobe.entry = (void *)ujprobe_event_handler;
@@ -1239,7 +1238,6 @@ int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic)
 
        if (ip->flag_retprobe) {
                // Mr_Nobody: comment for valencia
-               ip->retprobe.up.kp.tgid = task->tgid;
                if (ip->retprobe.handler == NULL) {
                        ip->retprobe.handler = (uretprobe_handler_t)uretprobe_event_handler;
                        DPRINTF("Set default ret event handler for %x\n", ip->offset);
index b3ec4f6..f8ab08e 100644 (file)
@@ -346,7 +346,7 @@ static int kprobe_handler(struct pt_regs *regs)
 
        kcb = get_kprobe_ctlblk();
        cur = kprobe_running();
-       p = get_kprobe((kprobe_opcode_t *)regs->ARM_pc, 0);
+       p = get_kprobe((void *)regs->ARM_pc);
 
        if (p) {
                if (cur) {
@@ -420,10 +420,6 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
        entry_point_t entry = (entry_point_t)jp->entry;
        pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry;
 
-       if (p->tgid) {
-               panic("setjmp_pre_handler: p->tgid == 0");
-       }
-
        if (((unsigned long)p->addr == sched_addr) && sched_rp) {
                struct thread_info *tinfo = (struct thread_info *)regs->ARM_r2;
                patch_suspended_task(sched_rp, tinfo->task);
@@ -515,14 +511,6 @@ int trampoline_probe_handler (struct kprobe *p, struct pt_regs *regs)
 
        DBPRINTF ("start");
 
-       if (p && p->tgid){
-               // in case of user space retprobe trampoline is at the Nth instruction of US tramp
-               if (!thumb_mode( regs ))
-                       trampoline_address = (unsigned long)(p->ainsn.insn + UPROBES_TRAMP_RET_BREAK_IDX);
-               else
-                       trampoline_address = (unsigned long)(p->ainsn.insn) + 0x1b;
-       }
-
        spin_lock_irqsave (&kretprobe_lock, flags);
 
        /*
@@ -531,11 +519,7 @@ int trampoline_probe_handler (struct kprobe *p, struct pt_regs *regs)
         * task_struct.  User space probes can be shared between threads of one
         * process so they have different current but same mm.
         */
-       if (p && p->tgid) {
-               head = kretprobe_inst_table_head(current->mm);
-       } else {
-               head = kretprobe_inst_table_head(current);
-       }
+       head = kretprobe_inst_table_head(current);
 
        /*
         * It is possible to have multiple instances associated with a given
@@ -577,8 +561,6 @@ int trampoline_probe_handler (struct kprobe *p, struct pt_regs *regs)
        //if (ri->rp) BUG_ON (ri->rp->kp.tgid == 0);
        //else if (ri->rp2) BUG_ON (ri->rp2->kp.tgid == 0);
        //}
-       if ((ri->rp && ri->rp->kp.tgid) || (ri->rp2 && ri->rp2->kp.tgid))
-               BUG_ON (trampoline_address == (unsigned long) &kretprobe_trampoline);
 
        regs->uregs[14] = orig_ret_address;
        DBPRINTF ("regs->uregs[14] = 0x%lx\n", regs->uregs[14]);
@@ -689,10 +671,6 @@ void  __arch_prepare_kretprobe (struct kretprobe *rp, struct pt_regs *regs)
                /* Set flag of current mode */
                ri->sp = (kprobe_opcode_t *)((long)ri->sp | !!thumb_mode(regs));
 
-               if (rp->kp.tgid) {
-                       panic("__arch_prepare_kretprobe: rp->kp.tgid != 0");
-               }
-
                /* Replace the return addr with trampoline addr */
                regs->uregs[14] = (unsigned long) &kretprobe_trampoline;
 
index 7122a0e..f71ddda 100644 (file)
@@ -141,22 +141,20 @@ struct kprobe_ctlblk *get_kprobe_ctlblk (void)
  *                             OR
  *     - with preemption disabled - from arch/xxx/kernel/kprobes.c
  */
-struct kprobe *get_kprobe(kprobe_opcode_t *addr, pid_t tgid)
+struct kprobe *get_kprobe(void *addr)
 {
        struct hlist_head *head;
        struct hlist_node *node;
-       struct kprobe *p, *retVal = NULL;
+       struct kprobe *p;
 
        head = &kprobe_table[hash_ptr (addr, KPROBE_HASH_BITS)];
        hlist_for_each_entry_rcu(p, node, head, hlist) {
-               if (p->addr == addr && p->tgid == tgid) {
-                       retVal = p;
-                       break;
+               if (p->addr == addr) {
+                       return p;
                }
        }
 
-       DBPRINTF ("get_kprobe: probe %p", retVal);
-       return retVal;
+       return NULL;
 }
 
 /*
@@ -349,7 +347,6 @@ void copy_kprobe (struct kprobe *old_p, struct kprobe *p)
 {
        memcpy (&p->opcode, &old_p->opcode, sizeof (kprobe_opcode_t));
        memcpy (&p->ainsn, &old_p->ainsn, sizeof (struct arch_specific_insn));
-       p->tgid = old_p->tgid;
        p->ss_addr = old_p->ss_addr;
 #ifdef CONFIG_ARM
        p->safe_arm = old_p->safe_arm;
@@ -493,7 +490,7 @@ int dbi_register_kprobe (struct kprobe *p)
     p->mod_refcounted = 0;
     p->nmissed = 0;
 
-    old_p = get_kprobe(p->addr, 0);
+    old_p = get_kprobe(p->addr);
     if (old_p)
     {
         ret = register_aggr_kprobe (old_p, p);
@@ -518,9 +515,9 @@ out:
 void dbi_unregister_kprobe (struct kprobe *p, struct task_struct *task)
 {
        struct kprobe *old_p, *list_p;
-       int cleanup_p, pid = p->tgid;
+       int cleanup_p;
 
-       old_p = get_kprobe(p->addr, pid);
+       old_p = get_kprobe(p->addr);
        DBPRINTF ("dbi_unregister_kprobe p=%p old_p=%p", p, old_p);
        if (unlikely (!old_p))
                return;
@@ -764,7 +761,7 @@ struct kretprobe * clone_kretprobe (struct kretprobe *rp)
        clone->kp.post_handler = NULL;
        clone->kp.fault_handler = NULL;
        clone->kp.break_handler = NULL;
-       old_p = get_kprobe(rp->kp.addr, rp->kp.tgid);
+       old_p = get_kprobe(rp->kp.addr);
        if (old_p)
        {
                ret = register_aggr_kprobe (old_p, &clone->kp);
index 161c328..3541937 100644 (file)
@@ -122,8 +122,6 @@ struct kprobe
        kprobe_opcode_t                                 opcode;
        /* copy of the original instruction */
        struct arch_specific_insn                       ainsn;
-       // TGID to which probe belongs
-       pid_t                                           tgid;
        // override single-step target address,
        // may be used to redirect control-flow to arbitrary address after probe point
        // without invocation of original instruction;
@@ -222,7 +220,7 @@ extern void kprobes_inc_nmissed_count (struct kprobe *p);
 
 
 /* Get the kprobe at this addr (if any) - called with preemption disabled */
-struct kprobe *get_kprobe(kprobe_opcode_t *addr, pid_t tgid);
+struct kprobe *get_kprobe(void *addr);
 struct kprobe *get_ukprobe_by_insn_slot(void *addr, pid_t tgid, struct pt_regs *regs);
 struct hlist_head *kretprobe_inst_table_head (void *hash_key);
 
index 5fae81c..48ce30b 100644 (file)
@@ -109,7 +109,6 @@ static inline void copy_uprobe(struct kprobe *old_p, struct kprobe *p)
 {
        memcpy(&p->opcode, &old_p->opcode, sizeof(kprobe_opcode_t));
        memcpy(&p->ainsn, &old_p->ainsn, sizeof(struct arch_specific_insn));
-       p->tgid = old_p->tgid;
        p->ss_addr = old_p->ss_addr;
 #ifdef CONFIG_ARM
        p->safe_arm = old_p->safe_arm;
@@ -378,10 +377,6 @@ static void remove_uprobe(struct uprobe *up)
        struct kprobe *p = &up->kp;
        struct task_struct *task = up->task;
 
-       if (p->tgid == 0) {
-               panic("remove_uprobe for tgid == 0!!!");
-       }
-
 #ifdef CONFIG_ARM
        free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm);
        free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb);
@@ -540,7 +535,7 @@ int dbi_register_uprobe(struct uprobe *up, int atomic)
 #endif
 
        // get the first item
-       old_p = get_ukprobe(p->addr, p->tgid);
+       old_p = get_ukprobe(p->addr, kp2up(p)->task->tgid);
        if (old_p) {
 #ifdef CONFIG_ARM
                p->safe_arm = old_p->safe_arm;
@@ -580,7 +575,7 @@ void dbi_unregister_uprobe(struct uprobe *up, int atomic)
        int cleanup_p;
 
        p = &up->kp;
-       old_p = get_ukprobe(p->addr, p->tgid);
+       old_p = get_ukprobe(p->addr, kp2up(p)->task->tgid);
        if (unlikely(!old_p)) {
                return;
        }
@@ -883,7 +878,7 @@ int dbi_disarm_urp_inst_for_task(struct task_struct *parent, struct task_struct
        struct hlist_head *head = uretprobe_inst_table_head(parent->mm);
 
        hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
-               if (parent == ri->task && ri->rp->up.kp.tgid) {
+               if (parent == ri->task) {
                        dbi_disarm_urp_inst(ri, task);
                }
        }
@@ -945,7 +940,7 @@ void dbi_unregister_all_uprobes(struct task_struct *task, int atomic)
        for (i = 0; i < UPROBE_TABLE_SIZE; ++i) {
                head = &uprobe_table[i];
                hlist_for_each_entry_safe(p, node, tnode, head, hlist) {
-                       if (p->tgid == task->tgid) {
+                       if (kp2up(p)->task->tgid == task->tgid) {
                                struct uprobe *up = container_of(p, struct uprobe, kp);
                                printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n",
                                                p->addr, (unsigned long)p->opcode, task->comm, task->pid);