[PATCH v2 5/5] perf test: Make daemon signal test less racy

Ian Rogers posted 5 patches 1 year, 11 months ago
[PATCH v2 5/5] perf test: Make daemon signal test less racy
Posted by Ian Rogers 1 year, 11 months ago
The daemon signal test sends signals and then expects files to be
written. It was observed on an Intel Alderlake that the signals were
sent too quickly leading to the 3 expected files not appearing. To
avoid this send the next signal only after the expected previous file
has appeared. To avoid an infinite loop the number of retries is
limited.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/tests/shell/daemon.sh | 34 ++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/tools/perf/tests/shell/daemon.sh b/tools/perf/tests/shell/daemon.sh
index 4c598cfc5afa..e5fa8d6f9eb1 100755
--- a/tools/perf/tests/shell/daemon.sh
+++ b/tools/perf/tests/shell/daemon.sh
@@ -414,16 +414,30 @@ EOF
 	# start daemon
 	daemon_start ${config} test
 
-	# send 2 signals
-	perf daemon signal --config ${config} --session test
-	perf daemon signal --config ${config}
-
-	# stop daemon
-	daemon_exit ${config}
-
-	# count is 2 perf.data for signals and 1 for perf record finished
-	count=`ls ${base}/session-test/*perf.data* | wc -l`
-	if [ ${count} -ne 3 ]; then
+        # send 2 signals then exit. Do this in a loop watching the number of
+        # files to avoid races. If the loop retries more than 600 times then
+        # give up.
+	local retries=0
+	local signals=0
+	local success=0
+	while [ ${retries} -lt 600 ] && [ ${success} -eq 0 ]; do
+		local files
+		files=`ls ${base}/session-test/*perf.data* 2> /dev/null | wc -l`
+		if [ ${signals} -eq 0 ]; then
+			perf daemon signal --config ${config} --session test
+			signals=1
+		elif [ ${signals} -eq 1 ] && [ $files -ge 1 ]; then
+			perf daemon signal --config ${config}
+			signals=2
+		elif [ ${signals} -eq 2 ] && [ $files -ge 2 ]; then
+			daemon_exit ${config}
+			signals=3
+		elif [ ${signals} -eq 3 ] && [ $files -ge 3 ]; then
+			success=1
+		fi
+		retries=$((${retries} +1))
+	done
+	if [ ${success} -eq 0 ]; then
 		error=1
 		echo "FAILED: perf data no generated"
 	fi
-- 
2.43.0.429.g432eaa2c6b-goog
Re: [PATCH v2 5/5] perf test: Make daemon signal test less racy
Posted by Jiri Olsa 1 year, 11 months ago
On Tue, Jan 23, 2024 at 08:30:15PM -0800, Ian Rogers wrote:
> The daemon signal test sends signals and then expects files to be
> written. It was observed on an Intel Alderlake that the signals were
> sent too quickly leading to the 3 expected files not appearing. To
> avoid this send the next signal only after the expected previous file
> has appeared. To avoid an infinite loop the number of retries is
> limited.
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> Acked-by: Namhyung Kim <namhyung@kernel.org>

Acked-by: Jiri Olsa <jolsa@kernel.org>

jirka

> ---
>  tools/perf/tests/shell/daemon.sh | 34 ++++++++++++++++++++++----------
>  1 file changed, 24 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/perf/tests/shell/daemon.sh b/tools/perf/tests/shell/daemon.sh
> index 4c598cfc5afa..e5fa8d6f9eb1 100755
> --- a/tools/perf/tests/shell/daemon.sh
> +++ b/tools/perf/tests/shell/daemon.sh
> @@ -414,16 +414,30 @@ EOF
>  	# start daemon
>  	daemon_start ${config} test
>  
> -	# send 2 signals
> -	perf daemon signal --config ${config} --session test
> -	perf daemon signal --config ${config}
> -
> -	# stop daemon
> -	daemon_exit ${config}
> -
> -	# count is 2 perf.data for signals and 1 for perf record finished
> -	count=`ls ${base}/session-test/*perf.data* | wc -l`
> -	if [ ${count} -ne 3 ]; then
> +        # send 2 signals then exit. Do this in a loop watching the number of
> +        # files to avoid races. If the loop retries more than 600 times then
> +        # give up.
> +	local retries=0
> +	local signals=0
> +	local success=0
> +	while [ ${retries} -lt 600 ] && [ ${success} -eq 0 ]; do
> +		local files
> +		files=`ls ${base}/session-test/*perf.data* 2> /dev/null | wc -l`
> +		if [ ${signals} -eq 0 ]; then
> +			perf daemon signal --config ${config} --session test
> +			signals=1
> +		elif [ ${signals} -eq 1 ] && [ $files -ge 1 ]; then
> +			perf daemon signal --config ${config}
> +			signals=2
> +		elif [ ${signals} -eq 2 ] && [ $files -ge 2 ]; then
> +			daemon_exit ${config}
> +			signals=3
> +		elif [ ${signals} -eq 3 ] && [ $files -ge 3 ]; then
> +			success=1
> +		fi
> +		retries=$((${retries} +1))
> +	done
> +	if [ ${success} -eq 0 ]; then
>  		error=1
>  		echo "FAILED: perf data no generated"
>  	fi
> -- 
> 2.43.0.429.g432eaa2c6b-goog
>