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:
Родитель
0216234c2e
Коммит
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",
|
||||
|
|
Загрузка…
Ссылка в новой задаче