summaryrefslogtreecommitdiffstats
path: root/kernel/kprobes.c
diff options
context:
space:
mode:
authorKeshavamurthy Anil S <anil.s.keshavamurthy@intel.com>2005-12-12 09:37:12 +0100
committerLinus Torvalds <torvalds@g5.osdl.org>2005-12-12 17:57:43 +0100
commitadad0f331f9c693129e81e233c5461e2e7c3e443 (patch)
tree846b37c12e8a07b7f4f3f5dbecb4b060c2be01c1 /kernel/kprobes.c
parent[PATCH] add hlist_replace_rcu() (diff)
downloadlinux-adad0f331f9c693129e81e233c5461e2e7c3e443.tar.xz
linux-adad0f331f9c693129e81e233c5461e2e7c3e443.zip
[PATCH] kprobes: fix race in aggregate kprobe registration
When registering multiple kprobes at the same address, we leave a small window where the kprobe hlist will not contain a reference to the registered kprobe, leading to potentially, a system crash if the breakpoint is hit on another processor. Patch below now automically relpace the old kprobe with the new kprobe from the hash list. Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: "Paul E. McKenney" <paulmck@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r--kernel/kprobes.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index fde5a16a2913..e4f0fc62bd3e 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -399,10 +399,7 @@ static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
INIT_LIST_HEAD(&ap->list);
list_add_rcu(&p->list, &ap->list);
- INIT_HLIST_NODE(&ap->hlist);
- hlist_del_rcu(&p->hlist);
- hlist_add_head_rcu(&ap->hlist,
- &kprobe_table[hash_ptr(ap->addr, KPROBE_HASH_BITS)]);
+ hlist_replace_rcu(&p->hlist, &ap->hlist);
}
/*