]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/kprobes.c
[PATCH] kprobes: moves lock-unlock to non-arch kprobe_flush_task
[linux-2.6-omap-h63xx.git] / kernel / kprobes.c
index 692fbf75ab49d1d8ae9fd01a582b84b93af8e756..dd42e717dd353202baa4948c4bb5dd46e08c3522 100644 (file)
@@ -229,7 +229,10 @@ struct kretprobe_instance *get_rp_inst_tsk(struct task_struct *tk)
  */
 void kprobe_flush_task(struct task_struct *tk)
 {
-       arch_kprobe_flush_task(tk, &kprobe_lock);
+       unsigned long flags = 0;
+       spin_lock_irqsave(&kprobe_lock, flags);
+       arch_kprobe_flush_task(tk);
+       spin_unlock_irqrestore(&kprobe_lock, flags);
 }
 
 /*
@@ -261,7 +264,7 @@ static inline void free_rp_inst(struct kretprobe *rp)
 static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
 {
        ap->addr = p->addr;
-       ap->opcode = p->opcode;
+       memcpy(&ap->opcode, &p->opcode, sizeof(kprobe_opcode_t));
        memcpy(&ap->ainsn, &p->ainsn, sizeof(struct arch_specific_insn));
 
        ap->pre_handler = aggr_pre_handler;
@@ -304,10 +307,8 @@ static int register_aggr_kprobe(struct kprobe *old_p, struct kprobe *p)
 /* kprobe removal house-keeping routines */
 static inline void cleanup_kprobe(struct kprobe *p, unsigned long flags)
 {
-       *p->addr = p->opcode;
+       arch_disarm_kprobe(p);
        hlist_del(&p->hlist);
-       flush_icache_range((unsigned long) p->addr,
-                  (unsigned long) p->addr + sizeof(kprobe_opcode_t));
        spin_unlock_irqrestore(&kprobe_lock, flags);
        arch_remove_kprobe(p);
 }
@@ -344,10 +345,8 @@ int register_kprobe(struct kprobe *p)
        hlist_add_head(&p->hlist,
                       &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]);
 
-       p->opcode = *p->addr;
-       *p->addr = BREAKPOINT_INSTRUCTION;
-       flush_icache_range((unsigned long) p->addr,
-                          (unsigned long) p->addr + sizeof(kprobe_opcode_t));
+       arch_arm_kprobe(p);
+
 out:
        spin_unlock_irqrestore(&kprobe_lock, flags);
 rm_kprobe: