kprobes: makes kprobes/enabled works correctly for optimized kprobes.
debugfs/kprobes/enabled doesn't work correctly on optimized kprobes. Masami Hiramatsu has a test report on x86_64 platform: https://lkml.org/lkml/2015/1/19/274 This patch forces it to unoptimize kprobe if kprobes_all_disarmed is set. It also checks the flag in unregistering path for skipping unneeded disarming process when kprobes globally disarmed. 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
							
								
									977ad481b6
								
							
						
					
					
						commit
						69d54b916d
					
				| @ -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; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user