{
        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);
 
                /* 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;
                }
        }