perf probe: Skip same probe address for a given line
Fix to skip making a same probe address on given line. Since a DWARF line info contains several entries for one line with different column, perf probe will make a different probe on same address if user specifies a probe point by "function:line" or "file:line". e.g. $ perf probe -D kernel_read:8 p:probe/kernel_read_L8 kernel_read+39 p:probe/kernel_read_L8_1 kernel_read+39 This skips such duplicated probe addresses. Committer testing: # uname -a Linux quaco 5.3.0+ #2 SMP Thu Sep 19 16:13:22 -03 2019 x86_64 x86_64 x86_64 GNU/Linux # Before: # perf probe -D kernel_read:8 p:probe/kernel_read _text+3115191 p:probe/kernel_read_1 _text+3115191 # After: # perf probe -D kernel_read:8 p:probe/kernel_read _text+3115191 # Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lore.kernel.org/lkml/156886447061.10772.4261569305869149178.stgit@devnote2 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									0216234c2e
								
							
						
					
					
						commit
						1a375ae765
					
				| @ -1245,6 +1245,17 @@ static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf, | ||||
| 	return n; | ||||
| } | ||||
| 
 | ||||
| static bool trace_event_finder_overlap(struct trace_event_finder *tf) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < tf->ntevs; i++) { | ||||
| 		if (tf->pf.addr == tf->tevs[i].point.address) | ||||
| 			return true; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /* Add a found probe point into trace event list */ | ||||
| static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf) | ||||
| { | ||||
| @ -1255,6 +1266,14 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf) | ||||
| 	struct perf_probe_arg *args = NULL; | ||||
| 	int ret, i; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * For some reason (e.g. different column assigned to same address) | ||||
| 	 * This callback can be called with the address which already passed. | ||||
| 	 * Ignore it first. | ||||
| 	 */ | ||||
| 	if (trace_event_finder_overlap(tf)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/* Check number of tevs */ | ||||
| 	if (tf->ntevs == tf->max_tevs) { | ||||
| 		pr_warning("Too many( > %d) probe point found.\n", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user