workqueue: fix hang involving racing cancel[_delayed]_work_sync()'s for PREEMPT_NONE
[deliverable/linux.git] / kernel / kprobes.c
index c39790001854aed18332f9a14b80357d2e9cde2f..c90e417bb9636300e4f4fe87d2c995a6c2cdab12 100644 (file)
@@ -869,7 +869,8 @@ static void __disarm_kprobe(struct kprobe *p, bool reopt)
 {
        struct kprobe *_p;
 
-       unoptimize_kprobe(p, false);    /* Try to unoptimize */
+       /* Try to unoptimize */
+       unoptimize_kprobe(p, kprobes_all_disarmed);
 
        if (!kprobe_queued(p)) {
                arch_disarm_kprobe(p);
@@ -1571,7 +1572,13 @@ static struct kprobe *__disable_kprobe(struct kprobe *p)
 
                /* Try to disarm and disable this/parent probe */
                if (p == orig_p || aggr_kprobe_disabled(orig_p)) {
-                       disarm_kprobe(orig_p, true);
+                       /*
+                        * If kprobes_all_disarmed is set, orig_p
+                        * should have already been disarmed, so
+                        * skip unneed disarming process.
+                        */
+                       if (!kprobes_all_disarmed)
+                               disarm_kprobe(orig_p, true);
                        orig_p->flags |= KPROBE_FLAG_DISABLED;
                }
        }
This page took 0.061539 seconds and 5 git commands to generate.