kprobes: set kprobes_all_disarmed earlier to enable re-optimization.
In original code, the probed instruction doesn't get optimized after echo 0 > /sys/kernel/debug/kprobes/enabled echo 1 > /sys/kernel/debug/kprobes/enabled This is because original code checks kprobes_all_disarmed in optimize_kprobe(), but this flag is turned off after calling that function. Therefore, optimize_kprobe() will see kprobes_all_disarmed == true and doesn't do the optimization. This patch simply turns off kprobes_all_disarmed earlier to enable optimization. Signed-off-by: Wang Nan <wangnan0@huawei.com> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5125991c9a
commit
977ad481b6
|
@ -2320,6 +2320,12 @@ static void arm_all_kprobes(void)
|
||||||
if (!kprobes_all_disarmed)
|
if (!kprobes_all_disarmed)
|
||||||
goto already_enabled;
|
goto already_enabled;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* optimize_kprobe() called by arm_kprobe() checks
|
||||||
|
* kprobes_all_disarmed, so set kprobes_all_disarmed before
|
||||||
|
* arm_kprobe.
|
||||||
|
*/
|
||||||
|
kprobes_all_disarmed = false;
|
||||||
/* Arming kprobes doesn't optimize kprobe itself */
|
/* Arming kprobes doesn't optimize kprobe itself */
|
||||||
for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
|
for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
|
||||||
head = &kprobe_table[i];
|
head = &kprobe_table[i];
|
||||||
|
@ -2328,7 +2334,6 @@ static void arm_all_kprobes(void)
|
||||||
arm_kprobe(p);
|
arm_kprobe(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
kprobes_all_disarmed = false;
|
|
||||||
printk(KERN_INFO "Kprobes globally enabled\n");
|
printk(KERN_INFO "Kprobes globally enabled\n");
|
||||||
|
|
||||||
already_enabled:
|
already_enabled:
|
||||||
|
|
Loading…
Reference in New Issue