diff options
Diffstat (limited to 'kernel/kprobes.c')
| -rw-r--r-- | kernel/kprobes.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 06f58309fed2..c90e417bb963 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -127,7 +127,7 @@ static void *alloc_insn_page(void) | |||
| 127 | 127 | ||
| 128 | static void free_insn_page(void *page) | 128 | static void free_insn_page(void *page) |
| 129 | { | 129 | { |
| 130 | module_free(NULL, page); | 130 | module_memfree(page); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | struct kprobe_insn_cache kprobe_insn_slots = { | 133 | struct kprobe_insn_cache kprobe_insn_slots = { |
| @@ -717,7 +717,7 @@ static void prepare_optimized_kprobe(struct kprobe *p) | |||
| 717 | struct optimized_kprobe *op; | 717 | struct optimized_kprobe *op; |
| 718 | 718 | ||
| 719 | op = container_of(p, struct optimized_kprobe, kp); | 719 | op = container_of(p, struct optimized_kprobe, kp); |
| 720 | arch_prepare_optimized_kprobe(op); | 720 | arch_prepare_optimized_kprobe(op, p); |
| 721 | } | 721 | } |
| 722 | 722 | ||
| 723 | /* Allocate new optimized_kprobe and try to prepare optimized instructions */ | 723 | /* Allocate new optimized_kprobe and try to prepare optimized instructions */ |
| @@ -731,7 +731,7 @@ static struct kprobe *alloc_aggr_kprobe(struct kprobe *p) | |||
| 731 | 731 | ||
| 732 | INIT_LIST_HEAD(&op->list); | 732 | INIT_LIST_HEAD(&op->list); |
| 733 | op->kp.addr = p->addr; | 733 | op->kp.addr = p->addr; |
| 734 | arch_prepare_optimized_kprobe(op); | 734 | arch_prepare_optimized_kprobe(op, p); |
| 735 | 735 | ||
| 736 | return &op->kp; | 736 | return &op->kp; |
| 737 | } | 737 | } |
| @@ -869,7 +869,8 @@ static void __disarm_kprobe(struct kprobe *p, bool reopt) | |||
| 869 | { | 869 | { |
| 870 | struct kprobe *_p; | 870 | struct kprobe *_p; |
| 871 | 871 | ||
| 872 | unoptimize_kprobe(p, false); /* Try to unoptimize */ | 872 | /* Try to unoptimize */ |
| 873 | unoptimize_kprobe(p, kprobes_all_disarmed); | ||
| 873 | 874 | ||
| 874 | if (!kprobe_queued(p)) { | 875 | if (!kprobe_queued(p)) { |
| 875 | arch_disarm_kprobe(p); | 876 | arch_disarm_kprobe(p); |
| @@ -1571,7 +1572,13 @@ static struct kprobe *__disable_kprobe(struct kprobe *p) | |||
| 1571 | 1572 | ||
| 1572 | /* Try to disarm and disable this/parent probe */ | 1573 | /* Try to disarm and disable this/parent probe */ |
| 1573 | if (p == orig_p || aggr_kprobe_disabled(orig_p)) { | 1574 | if (p == orig_p || aggr_kprobe_disabled(orig_p)) { |
| 1574 | disarm_kprobe(orig_p, true); | 1575 | /* |
| 1576 | * If kprobes_all_disarmed is set, orig_p | ||
| 1577 | * should have already been disarmed, so | ||
| 1578 | * skip unneed disarming process. | ||
| 1579 | */ | ||
| 1580 | if (!kprobes_all_disarmed) | ||
| 1581 | disarm_kprobe(orig_p, true); | ||
| 1575 | orig_p->flags |= KPROBE_FLAG_DISABLED; | 1582 | orig_p->flags |= KPROBE_FLAG_DISABLED; |
| 1576 | } | 1583 | } |
| 1577 | } | 1584 | } |
| @@ -2320,6 +2327,12 @@ static void arm_all_kprobes(void) | |||
| 2320 | if (!kprobes_all_disarmed) | 2327 | if (!kprobes_all_disarmed) |
| 2321 | goto already_enabled; | 2328 | goto already_enabled; |
| 2322 | 2329 | ||
| 2330 | /* | ||
| 2331 | * optimize_kprobe() called by arm_kprobe() checks | ||
| 2332 | * kprobes_all_disarmed, so set kprobes_all_disarmed before | ||
| 2333 | * arm_kprobe. | ||
| 2334 | */ | ||
| 2335 | kprobes_all_disarmed = false; | ||
| 2323 | /* Arming kprobes doesn't optimize kprobe itself */ | 2336 | /* Arming kprobes doesn't optimize kprobe itself */ |
| 2324 | for (i = 0; i < KPROBE_TABLE_SIZE; i++) { | 2337 | for (i = 0; i < KPROBE_TABLE_SIZE; i++) { |
| 2325 | head = &kprobe_table[i]; | 2338 | head = &kprobe_table[i]; |
| @@ -2328,7 +2341,6 @@ static void arm_all_kprobes(void) | |||
| 2328 | arm_kprobe(p); | 2341 | arm_kprobe(p); |
| 2329 | } | 2342 | } |
| 2330 | 2343 | ||
| 2331 | kprobes_all_disarmed = false; | ||
| 2332 | printk(KERN_INFO "Kprobes globally enabled\n"); | 2344 | printk(KERN_INFO "Kprobes globally enabled\n"); |
| 2333 | 2345 | ||
| 2334 | already_enabled: | 2346 | already_enabled: |
