From a70e8ac65c9c19cf16549a061c23ad9ee698095f Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Tue, 2 Apr 2013 13:51:42 +0400 Subject: [PATCH] [REFACTOR] remove field 'tgid' from 'struct kprobe' --- driver/us_proc_inst.c | 2 -- kprobe/arch/asm-arm/dbi_kprobes.c | 26 ++------------------------ kprobe/dbi_kprobes.c | 21 +++++++++------------ kprobe/dbi_kprobes.h | 4 +--- uprobe/swap_uprobes.c | 13 ++++--------- 5 files changed, 16 insertions(+), 50 deletions(-) diff --git a/driver/us_proc_inst.c b/driver/us_proc_inst.c index ac72863..08c6533 100644 --- a/driver/us_proc_inst.c +++ b/driver/us_proc_inst.c @@ -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); diff --git a/kprobe/arch/asm-arm/dbi_kprobes.c b/kprobe/arch/asm-arm/dbi_kprobes.c index b3ec4f6..f8ab08e 100644 --- a/kprobe/arch/asm-arm/dbi_kprobes.c +++ b/kprobe/arch/asm-arm/dbi_kprobes.c @@ -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; diff --git a/kprobe/dbi_kprobes.c b/kprobe/dbi_kprobes.c index 7122a0e..f71ddda 100644 --- a/kprobe/dbi_kprobes.c +++ b/kprobe/dbi_kprobes.c @@ -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); diff --git a/kprobe/dbi_kprobes.h b/kprobe/dbi_kprobes.h index 161c328..3541937 100644 --- a/kprobe/dbi_kprobes.h +++ b/kprobe/dbi_kprobes.h @@ -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); diff --git a/uprobe/swap_uprobes.c b/uprobe/swap_uprobes.c index 5fae81c..48ce30b 100644 --- a/uprobe/swap_uprobes.c +++ b/uprobe/swap_uprobes.c @@ -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); -- 2.7.4