Re: [PATCH] perf test probe_vfs_getname: Correct probe line for updated kernel code

From: Arnaldo Carvalho de Melo
Date: Fri May 16 2025 - 14:50:01 EST


On Fri, May 16, 2025 at 10:05:32AM +0100, Leo Yan wrote:
> Since commit 611851010c74 ("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.
>
> Update the regular expression to search for the call site of initname().

Well, I'd say we should add, not update, i.e. a new perf should continue
to work on an older kernel, so please consider the following patch.

- Arnaldo

diff --git a/tools/perf/tests/shell/lib/probe_vfs_getname.sh b/tools/perf/tests/shell/lib/probe_vfs_getname.sh
index 89f72a4c818c712b..aa867e28eadc46bc 100644
--- a/tools/perf/tests/shell/lib/probe_vfs_getname.sh
+++ b/tools/perf/tests/shell/lib/probe_vfs_getname.sh
@@ -13,8 +13,17 @@ cleanup_probe_vfs_getname() {
add_probe_vfs_getname() {
add_probe_verbose=$1
if [ $had_vfs_getname -eq 1 ] ; 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/")
+ # Please keep the older regexps so that this will pass on older kernels as well
+ # as in the most recent one.
+
+ 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/")
+
+ 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/")

> This provides a valid source line number for adding the probe.
>
> Fixes: 611851010c74 ("fs: dedup handling of struct filename init and refcounts bumps")
> Signed-off-by: Leo Yan <leo.yan@xxxxxxx>
> ---
> tools/perf/tests/shell/lib/probe_vfs_getname.sh | 8 ++------
> 1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/tests/shell/lib/probe_vfs_getname.sh b/tools/perf/tests/shell/lib/probe_vfs_getname.sh
> index 89f72a4c818c..cbfdd2a62c6e 100644
> --- a/tools/perf/tests/shell/lib/probe_vfs_getname.sh
> +++ b/tools/perf/tests/shell/lib/probe_vfs_getname.sh
> @@ -13,12 +13,8 @@ cleanup_probe_vfs_getname() {
> add_probe_vfs_getname() {
> add_probe_verbose=$1
> if [ $had_vfs_getname -eq 1 ] ; 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/")
> - 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
> + 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/")
>
> if [ -z "$line" ] ; then
> echo "Could not find probeable line"
> --
> 2.34.1