Skip to content

Commit 1a375ae

Browse files
mhiramatacmel
authored andcommitted
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>
1 parent 0216234 commit 1a375ae

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

tools/perf/util/probe-finder.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,17 @@ static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf,
12451245
return n;
12461246
}
12471247

1248+
static bool trace_event_finder_overlap(struct trace_event_finder *tf)
1249+
{
1250+
int i;
1251+
1252+
for (i = 0; i < tf->ntevs; i++) {
1253+
if (tf->pf.addr == tf->tevs[i].point.address)
1254+
return true;
1255+
}
1256+
return false;
1257+
}
1258+
12481259
/* Add a found probe point into trace event list */
12491260
static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
12501261
{
@@ -1255,6 +1266,14 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
12551266
struct perf_probe_arg *args = NULL;
12561267
int ret, i;
12571268

1269+
/*
1270+
* For some reason (e.g. different column assigned to same address)
1271+
* This callback can be called with the address which already passed.
1272+
* Ignore it first.
1273+
*/
1274+
if (trace_event_finder_overlap(tf))
1275+
return 0;
1276+
12581277
/* Check number of tevs */
12591278
if (tf->ntevs == tf->max_tevs) {
12601279
pr_warning("Too many( > %d) probe point found.\n",

0 commit comments

Comments
 (0)