aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/kprobes.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index 1d5dd1337bd1..d8903e60c99a 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -107,13 +107,17 @@ rm_kprobe:
107void unregister_kprobe(struct kprobe *p) 107void unregister_kprobe(struct kprobe *p)
108{ 108{
109 unsigned long flags; 109 unsigned long flags;
110 arch_remove_kprobe(p);
111 spin_lock_irqsave(&kprobe_lock, flags); 110 spin_lock_irqsave(&kprobe_lock, flags);
111 if (!get_kprobe(p->addr)) {
112 spin_unlock_irqrestore(&kprobe_lock, flags);
113 return;
114 }
112 *p->addr = p->opcode; 115 *p->addr = p->opcode;
113 hlist_del(&p->hlist); 116 hlist_del(&p->hlist);
114 flush_icache_range((unsigned long) p->addr, 117 flush_icache_range((unsigned long) p->addr,
115 (unsigned long) p->addr + sizeof(kprobe_opcode_t)); 118 (unsigned long) p->addr + sizeof(kprobe_opcode_t));
116 spin_unlock_irqrestore(&kprobe_lock, flags); 119 spin_unlock_irqrestore(&kprobe_lock, flags);
120 arch_remove_kprobe(p);
117} 121}
118 122
119static struct notifier_block kprobe_exceptions_nb = { 123static struct notifier_block kprobe_exceptions_nb = {