1f72bcb92SBenjamin Peterson#!/bin/sh 2f72bcb92SBenjamin Peterson# perf trace exit race 3f72bcb92SBenjamin Peterson# SPDX-License-Identifier: GPL-2.0 4f72bcb92SBenjamin Peterson 5f72bcb92SBenjamin Peterson# Check that the last events of a perf trace'd subprocess are not 6f72bcb92SBenjamin Peterson# lost. Specifically, trace the exiting syscall of "true" 10 times and ensure 7f72bcb92SBenjamin Peterson# the output contains 10 correct lines. 8f72bcb92SBenjamin Peterson 9f72bcb92SBenjamin Peterson# shellcheck source=lib/probe.sh 10f72bcb92SBenjamin Peterson. "$(dirname $0)"/lib/probe.sh 11f72bcb92SBenjamin Peterson 12f72bcb92SBenjamin Petersonskip_if_no_perf_trace || exit 2 13f72bcb92SBenjamin Peterson 147ca41faaSArnaldo Carvalho de Meloif [ "$1" = "-v" ]; then 157ca41faaSArnaldo Carvalho de Melo verbose="1" 167ca41faaSArnaldo Carvalho de Melofi 177ca41faaSArnaldo Carvalho de Melo 187ca41faaSArnaldo Carvalho de Meloiter=10 19*0b687912SArnaldo Carvalho de Meloregexp=" +[0-9]+\.[0-9]+ [0-9]+ syscalls:sys_enter_exit_group\(\)$" 207ca41faaSArnaldo Carvalho de Melo 21f72bcb92SBenjamin Petersontrace_shutdown_race() { 227ca41faaSArnaldo Carvalho de Melo for _ in $(seq $iter); do 23*0b687912SArnaldo Carvalho de Melo perf trace --no-comm -e syscalls:sys_enter_exit_group true 2>>$file 24f72bcb92SBenjamin Peterson done 257ca41faaSArnaldo Carvalho de Melo result="$(grep -c -E "$regexp" $file)" 267ca41faaSArnaldo Carvalho de Melo [ $result = $iter ] 27f72bcb92SBenjamin Peterson} 28f72bcb92SBenjamin Peterson 29f72bcb92SBenjamin Peterson 30f72bcb92SBenjamin Petersonfile=$(mktemp /tmp/temporary_file.XXXXX) 31f72bcb92SBenjamin Peterson 32f72bcb92SBenjamin Peterson# Do not use whatever ~/.perfconfig file, it may change the output 33f72bcb92SBenjamin Peterson# via trace.{show_timestamp,show_prefix,etc} 34f72bcb92SBenjamin Petersonexport PERF_CONFIG=/dev/null 35f72bcb92SBenjamin Peterson 36f72bcb92SBenjamin Petersontrace_shutdown_race 37f72bcb92SBenjamin Petersonerr=$? 387ca41faaSArnaldo Carvalho de Melo 397ca41faaSArnaldo Carvalho de Meloif [ $err != 0 ] && [ "${verbose}" = "1" ]; then 407ca41faaSArnaldo Carvalho de Melo lines_not_matching=$(mktemp /tmp/temporary_file.XXXXX) 417ca41faaSArnaldo Carvalho de Melo if grep -v -E "$regexp" $file > $lines_not_matching ; then 427ca41faaSArnaldo Carvalho de Melo echo "Lines not matching the expected regexp: '$regexp':" 437ca41faaSArnaldo Carvalho de Melo cat $lines_not_matching 447ca41faaSArnaldo Carvalho de Melo else 457ca41faaSArnaldo Carvalho de Melo echo "Missing output, expected $iter but only got $result" 467ca41faaSArnaldo Carvalho de Melo fi 477ca41faaSArnaldo Carvalho de Melo rm -f $lines_not_matching 487ca41faaSArnaldo Carvalho de Melofi 497ca41faaSArnaldo Carvalho de Melo 50f72bcb92SBenjamin Petersonrm -f ${file} 51f72bcb92SBenjamin Petersonexit $err 52