mirror of
https://github.com/torvalds/linux.git
synced 2026-04-22 16:53:59 -04:00
Since commit611851010c("fs: dedup handling of struct filename init and refcounts bumps"), the kernel has been refactored to use a new inline function initname(), moving name initialization into it. As a result, the perf probe test can no longer find the source line that matches the defined regular expressions. This causes the script to fail when attempting to add probes. Add a regular expression to search for the call site of initname(). This provides a valid source line number for adding the probe. Keeps the older regular expressions for passing test on older kernels. Fixes:611851010c("fs: dedup handling of struct filename init and refcounts bumps") Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org> Signed-off-by: Leo Yan <leo.yan@arm.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Christian Brauner <brauner@kernel.org> Cc: Ian Rogers <irogers@google.com> Cc: Jakub Brnak <jbrnak@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mateusz Guzik <mjguzik@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20250519082755.1669187-1-leo.yan@arm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
53 lines
1.7 KiB
Bash
53 lines
1.7 KiB
Bash
#!/bin/sh
|
|
# Arnaldo Carvalho de Melo <acme@kernel.org>, 2017
|
|
|
|
perf probe -l 2>&1 | grep -q probe:vfs_getname
|
|
had_vfs_getname=$?
|
|
|
|
cleanup_probe_vfs_getname() {
|
|
if [ $had_vfs_getname -eq 1 ] ; then
|
|
perf probe -q -d probe:vfs_getname*
|
|
fi
|
|
}
|
|
|
|
add_probe_vfs_getname() {
|
|
add_probe_verbose=$1
|
|
if [ $had_vfs_getname -eq 1 ] ; then
|
|
result_initname_re="[[:space:]]+([[:digit:]]+)[[:space:]]+initname.*"
|
|
line=$(perf probe -L getname_flags 2>&1 | grep -E "$result_initname_re" | sed -r "s/$result_initname_re/\1/")
|
|
|
|
# Search the old regular expressions so that this will
|
|
# pass on older kernels as well.
|
|
if [ -z "$line" ] ; then
|
|
result_filename_re="[[:space:]]+([[:digit:]]+)[[:space:]]+result->uptr.*"
|
|
line=$(perf probe -L getname_flags 2>&1 | grep -E "$result_filename_re" | sed -r "s/$result_filename_re/\1/")
|
|
fi
|
|
|
|
if [ -z "$line" ] ; then
|
|
result_aname_re="[[:space:]]+([[:digit:]]+)[[:space:]]+result->aname = NULL;"
|
|
line=$(perf probe -L getname_flags 2>&1 | grep -E "$result_aname_re" | sed -r "s/$result_aname_re/\1/")
|
|
fi
|
|
|
|
if [ -z "$line" ] ; then
|
|
echo "Could not find probeable line"
|
|
return 2
|
|
fi
|
|
|
|
perf probe -q "vfs_getname=getname_flags:${line} pathname=result->name:string" || \
|
|
perf probe $add_probe_verbose "vfs_getname=getname_flags:${line} pathname=filename:ustring" || return 1
|
|
fi
|
|
}
|
|
|
|
skip_if_no_debuginfo() {
|
|
add_probe_vfs_getname -v 2>&1 | grep -E -q "^(Failed to find the path for the kernel|Debuginfo-analysis is not supported)|(file has no debug information)" && return 2
|
|
return 1
|
|
}
|
|
|
|
# check if perf is compiled with libtraceevent support
|
|
skip_no_probe_record_support() {
|
|
if [ $had_vfs_getname -eq 1 ] ; then
|
|
perf check feature -q libtraceevent && return 1
|
|
return 2
|
|
fi
|
|
}
|