diff options
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 6 |
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: | |||
107 | void unregister_kprobe(struct kprobe *p) | 107 | void 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 | ||
119 | static struct notifier_block kprobe_exceptions_nb = { | 123 | static struct notifier_block kprobe_exceptions_nb = { |