tools/perf: Fix the string match for "/tmp/perf-$PID.map" files in dso__load
BugLink: https://bugs.launchpad.net/bugs/2083196 [ Upstream commit b0979f008f1352a44cd3c8877e3eb8a1e3e1c6f3 ] Perf test for perf probe of function from different CU fails as below: ./perf test -vv "test perf probe of function from different CU" 116: test perf probe of function from different CU: --- start --- test child forked, pid 2679 Failed to find symbol foo in /tmp/perf-uprobe-different-cu-sh.Msa7iy89bx/testfile Error: Failed to add events. --- Cleaning up --- "foo" does not hit any event. Error: Failed to delete events. ---- end(-1) ---- 116: test perf probe of function from different CU : FAILED! The test does below to probe function "foo" : # gcc -g -Og -flto -c /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.c -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.o # gcc -g -Og -c /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.c -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.o # gcc -g -Og -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.o # ./perf probe -x /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile foo Failed to find symbol foo in /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile Error: Failed to add events. Perf probe fails to find symbol foo in the executable placed in /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7 Simple reproduce: # mktemp -d /tmp/perf-checkXXXXXXXXXX /tmp/perf-checkcWpuLRQI8j # gcc -g -o test test.c # cp test /tmp/perf-checkcWpuLRQI8j/ # nm /tmp/perf-checkcWpuLRQI8j/test | grep foo 00000000100006bc T foo # ./perf probe -x /tmp/perf-checkcWpuLRQI8j/test foo Failed to find symbol foo in /tmp/perf-checkcWpuLRQI8j/test Error: Failed to add events. But it works with any files like /tmp/perf/test. Only for patterns with "/tmp/perf-", this fails. Further debugging, commit80d496be89("perf report: Add support for profiling JIT generated code") added support for profiling JIT generated code. This patch handles dso's of form "/tmp/perf-$PID.map" . The check used "if (strncmp(self->name, "/tmp/perf-", 10) == 0)" to match "/tmp/perf-$PID.map". With this commit, any dso in /tmp/perf- folder will be considered separately for processing (not only JIT created map files ). Fix this by changing the string pattern to check for "/tmp/perf-%d.map". Add a helper function is_perf_pid_map_name to do this check. In "struct dso", dso->long_name holds the long name of the dso file. Since the /tmp/perf-$PID.map check uses the complete name, use dso___long_name for the string name. With the fix, # ./perf test "test perf probe of function from different CU" 117: test perf probe of function from different CU : Ok Fixes:56cbeacf14("perf probe: Add test for regression introduced by switch to die_get_decl_file()") Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Reviewed-by: Chaitanya S Prakash <chaitanyas.prakash@arm.com> Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Cc: akanksha@linux.ibm.com Cc: kjain@linux.ibm.com Cc: maddy@linux.ibm.com Cc: disgoel@linux.vnet.ibm.com Cc: linuxppc-dev@lists.ozlabs.org Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240623064850.83720-1-atrajeev@linux.vnet.ibm.com Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Portia Stephens <portia.stephens@canonical.com> Signed-off-by: Roxana Nicolescu <roxana.nicolescu@canonical.com>
This commit is contained in:
committed by
Mehmet Basaran
parent
a25b3343dc
commit
88ebe8cc19
@@ -1532,3 +1532,15 @@ int dso__strerror_load(struct dso *dso, char *buf, size_t buflen)
|
||||
scnprintf(buf, buflen, "%s", dso_load__error_str[idx]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool perf_pid_map_tid(const char *dso_name, int *tid)
|
||||
{
|
||||
return sscanf(dso_name, "/tmp/perf-%d.map", tid) == 1;
|
||||
}
|
||||
|
||||
bool is_perf_pid_map_name(const char *dso_name)
|
||||
{
|
||||
int tid;
|
||||
|
||||
return perf_pid_map_tid(dso_name, &tid);
|
||||
}
|
||||
|
||||
@@ -411,4 +411,8 @@ int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
|
||||
|
||||
void reset_fd_limit(void);
|
||||
|
||||
/* Check if dso name is of format "/tmp/perf-%d.map" */
|
||||
bool perf_pid_map_tid(const char *dso_name, int *tid);
|
||||
bool is_perf_pid_map_name(const char *dso_name);
|
||||
|
||||
#endif /* __PERF_DSO */
|
||||
|
||||
@@ -1764,7 +1764,7 @@ int dso__load(struct dso *dso, struct map *map)
|
||||
const char *map_path = dso->long_name;
|
||||
|
||||
mutex_lock(&dso->lock);
|
||||
perfmap = strncmp(dso->name, "/tmp/perf-", 10) == 0;
|
||||
perfmap = is_perf_pid_map_name(map_path);
|
||||
if (perfmap) {
|
||||
if (dso->nsinfo && (dso__find_perf_map(newmapname,
|
||||
sizeof(newmapname), &dso->nsinfo) == 0)) {
|
||||
|
||||
Reference in New Issue
Block a user