diff options
Diffstat (limited to 'kernel')
| -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 = { |
