[REFACTOR] redesign get_uprobe()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 2 Apr 2013 07:47:45 +0000 (11:47 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 2 Apr 2013 07:47:45 +0000 (11:47 +0400)
-struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid)
+struct kprobe *get_ukprobe(void *addr, pid_t tgid)

uprobe/arch/asm-arm/swap_uprobes.c
uprobe/swap_uprobes.c
uprobe/swap_uprobes.h

index 2f6d160..b10c04e 100644 (file)
@@ -691,13 +691,7 @@ static int uprobe_handler(struct pt_regs *regs)
        struct uprobe *up;
        struct kprobe *p;
 
-       up = get_uprobe(addr, tgid);
-       p = &up->kp;
-
-       if (p && (check_validity_insn(up, regs) != 0)) {
-               printk("no_uprobe live\n");
-               return 0;
-       }
+       p = get_ukprobe(addr, tgid);
 
        if (p == NULL) {
                p = get_kprobe_by_insn_slot(addr, tgid, regs);
@@ -710,6 +704,12 @@ static int uprobe_handler(struct pt_regs *regs)
                return 0;
        }
 
+       up = kp2up(p);
+       if (p && (check_validity_insn(up, regs) != 0)) {
+               printk("no_uprobe live\n");
+               return 0;
+       }
+
        /* restore opcode for thumb app */
        if (thumb_mode(regs)) {
                if (!is_thumb2(p->opcode)) {
index a3f5be7..38c47cb 100644 (file)
@@ -222,11 +222,13 @@ static int register_aggr_uprobe(struct kprobe *old_p, struct kprobe *p)
                copy_uprobe(old_p, p);
                ret = add_new_uprobe(old_p, p);
        } else {
-               ap = kzalloc(sizeof(*ap), GFP_KERNEL);
-               if (!ap) {
+               struct uprobe *uap = kzalloc(sizeof(*uap), GFP_KERNEL);
+               if (!uap) {
                        return -ENOMEM;
                }
 
+               uap->task = kp2up(p)->task;
+               ap = up2kp(uap);
                add_aggr_uprobe(ap, old_p);
                copy_uprobe(ap, p);
                ret = add_new_uprobe(ap, p);
@@ -281,7 +283,7 @@ static void init_uretprobe_inst_table(void)
        }
 }
 
-struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid)
+struct kprobe *get_ukprobe(void *addr, pid_t tgid)
 {
        struct hlist_head *head;
        struct hlist_node *node;
@@ -289,8 +291,8 @@ struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid)
 
        head = &uprobe_table[hash_ptr(addr, UPROBE_HASH_BITS)];
        hlist_for_each_entry_rcu(p, node, head, hlist) {
-               if (p->addr == addr && p->tgid == tgid) {
-                       return container_of(p, struct uprobe, kp);
+               if (p->addr == addr && kp2up(p)->task->tgid == tgid) {
+                       return p;
                }
        }
 
@@ -547,7 +549,7 @@ int dbi_register_uprobe(struct uprobe *up, int atomic)
 #endif
 
        // get the first item
-       old_p = &get_uprobe(p->addr, p->tgid)->kp;
+       old_p = get_ukprobe(p->addr, p->tgid);
        if (old_p) {
 #ifdef CONFIG_ARM
                p->safe_arm = old_p->safe_arm;
@@ -587,7 +589,7 @@ void dbi_unregister_uprobe(struct uprobe *up, int atomic)
        int cleanup_p;
 
        p = &up->kp;
-       old_p = &get_uprobe(p->addr, p->tgid)->kp;
+       old_p = get_ukprobe(p->addr, p->tgid);
        if (unlikely(!old_p)) {
                return;
        }
index 902d990..da0c9fa 100644 (file)
@@ -91,7 +91,17 @@ void dbi_unregister_uretprobe(struct uretprobe *rp, int atomic);
 void dbi_unregister_all_uprobes(struct task_struct *task, int atomic);
 
 void dbi_uprobe_return(void);
-struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid);
+struct kprobe *get_ukprobe(void *addr, pid_t tgid);
+
+static inline struct uprobe *kp2up(struct kprobe *p)
+{
+       return container_of(p, struct uprobe, kp);
+}
+
+static inline struct kprobe *up2kp(struct uprobe *p)
+{
+       return &p->kp;
+}
 
 void disarm_uprobe(struct uprobe *p);