diff options
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 531e10164836..7663e5df0e6f 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -517,9 +517,9 @@ static __kprobes void do_unoptimize_kprobes(struct list_head *free_list) | |||
517 | /* Ditto to do_optimize_kprobes */ | 517 | /* Ditto to do_optimize_kprobes */ |
518 | get_online_cpus(); | 518 | get_online_cpus(); |
519 | mutex_lock(&text_mutex); | 519 | mutex_lock(&text_mutex); |
520 | list_for_each_entry_safe(op, tmp, &unoptimizing_list, list) { | 520 | arch_unoptimize_kprobes(&unoptimizing_list, free_list); |
521 | /* Unoptimize kprobes */ | 521 | /* Loop free_list for disarming */ |
522 | arch_unoptimize_kprobe(op); | 522 | list_for_each_entry_safe(op, tmp, free_list, list) { |
523 | /* Disarm probes if marked disabled */ | 523 | /* Disarm probes if marked disabled */ |
524 | if (kprobe_disabled(&op->kp)) | 524 | if (kprobe_disabled(&op->kp)) |
525 | arch_disarm_kprobe(&op->kp); | 525 | arch_disarm_kprobe(&op->kp); |
@@ -530,8 +530,6 @@ static __kprobes void do_unoptimize_kprobes(struct list_head *free_list) | |||
530 | * (reclaiming is done by do_free_cleaned_kprobes.) | 530 | * (reclaiming is done by do_free_cleaned_kprobes.) |
531 | */ | 531 | */ |
532 | hlist_del_rcu(&op->kp.hlist); | 532 | hlist_del_rcu(&op->kp.hlist); |
533 | /* Move only unused probes on free_list */ | ||
534 | list_move(&op->list, free_list); | ||
535 | } else | 533 | } else |
536 | list_del_init(&op->list); | 534 | list_del_init(&op->list); |
537 | } | 535 | } |
@@ -592,7 +590,7 @@ static __kprobes void kprobe_optimizer(struct work_struct *work) | |||
592 | mutex_unlock(&module_mutex); | 590 | mutex_unlock(&module_mutex); |
593 | 591 | ||
594 | /* Step 5: Kick optimizer again if needed */ | 592 | /* Step 5: Kick optimizer again if needed */ |
595 | if (!list_empty(&optimizing_list)) | 593 | if (!list_empty(&optimizing_list) || !list_empty(&unoptimizing_list)) |
596 | kick_kprobe_optimizer(); | 594 | kick_kprobe_optimizer(); |
597 | else | 595 | else |
598 | /* Wake up all waiters */ | 596 | /* Wake up all waiters */ |