summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorPrasanna S. Panchamukhi <prasanna@in.ibm.com>2005-01-20 16:00:15 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-20 16:00:15 -0800
commiteab5cc1e76bbb0320488cffe65185c20918a3d4a (patch)
tree15ec6f96423c3f16e517f9e7bea25a1aa1a19f66 /kernel
parent95e5e682f1a4cf716c89c9f9e6c01da898fb1f9c (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.c13
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,