diff options
| author | Prasanna S. Panchamukhi <prasanna@in.ibm.com> | 2005-01-20 16:00:15 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-20 16:00:15 -0800 |
| commit | eab5cc1e76bbb0320488cffe65185c20918a3d4a (patch) | |
| tree | 15ec6f96423c3f16e517f9e7bea25a1aa1a19f66 /kernel | |
| parent | 95e5e682f1a4cf716c89c9f9e6c01da898fb1f9c (diff) | |
[PATCH] kprobes: x86_64 memory allocation changes
Minor changes to the kprobes code to provide memory allocation for x86_64
architecture outside kprobes spin lock.
Signed-off-by: Prasanna S Panchamukhi <prasanna@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kprobes.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index cc6f72585f1e..4a331aed0866 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -76,18 +76,19 @@ struct kprobe *get_kprobe(void *addr) int register_kprobe(struct kprobe *p) { int ret = 0; - unsigned long flags; + unsigned long flags = 0; + if ((ret = arch_prepare_kprobe(p)) != 0) { + goto out; + } spin_lock_irqsave(&kprobe_lock, flags); INIT_HLIST_NODE(&p->hlist); if (get_kprobe(p->addr)) { ret = -EEXIST; goto out; } + arch_copy_kprobe(p); - if ((ret = arch_prepare_kprobe(p)) != 0) { - goto out; - } hlist_add_head(&p->hlist, &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); @@ -97,14 +98,16 @@ int register_kprobe(struct kprobe *p) (unsigned long) p->addr + sizeof(kprobe_opcode_t)); out: spin_unlock_irqrestore(&kprobe_lock, flags); + if (ret == -EEXIST) + arch_remove_kprobe(p); return ret; } void unregister_kprobe(struct kprobe *p) { unsigned long flags; - spin_lock_irqsave(&kprobe_lock, flags); arch_remove_kprobe(p); + spin_lock_irqsave(&kprobe_lock, flags); *p->addr = p->opcode; hlist_del(&p->hlist); flush_icache_range((unsigned long) p->addr, |
