From 96852655f17ec05c438590c6da2bba63091da0a1 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Thu, 24 Sep 2015 21:01:00 +0300 Subject: [PATCH] [FIX] kprobe and kretprobe disarming synchronization Guarantee that other CPUs not handle breakpoints right now. Change-Id: Ida84022387285ab71938f5f679d47a8a45a62d01 Signed-off-by: Vyacheslav Cherkashin --- kprobe/swap_kprobes.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/kprobe/swap_kprobes.c b/kprobe/swap_kprobes.c index 8a92c2b..7f11152 100644 --- a/kprobe/swap_kprobes.c +++ b/kprobe/swap_kprobes.c @@ -585,6 +585,11 @@ static void swap_unregister_valid_kprobe(struct kprobe *p, struct kprobe *old_p) (p->list.next == &old_p->list) && (p->list.prev == &old_p->list))) { /* Only probe on the hash list */ swap_arch_disarm_kprobe(p); + + /* FIXME: move sync out from atomic context */ + if (!in_atomic()) + synchronize_sched(); + hlist_del_rcu(&old_p->hlist); remove_kprobe(old_p); @@ -943,13 +948,14 @@ static int __swap_unregister_kretprobes_top(void *data) unsigned long flags; const size_t end = ((size_t) 0) - 1; - spin_lock_irqsave(&kretprobe_lock, flags); for (--size; size != end; --size) { swap_unregister_kprobe(&rps[size]->kp); - if (rp_disarm) + if (rp_disarm) { + spin_lock_irqsave(&kretprobe_lock, flags); swap_disarm_krp(rps[size]); + spin_unlock_irqrestore(&kretprobe_lock, flags); + } } - spin_unlock_irqrestore(&kretprobe_lock, flags); return 0; } -- 2.7.4