perf test: Fix "perf stat CSV output linter" test on s390
perf test -F 83 ("perf stat CSV output linter") fails on s390. Reason is the wrong number of fields for certain CPU core/die/socket related output. On x84_64 the output of command: # ./perf stat -x, -A -a --no-merge true CPU0,1.50,msec,cpu-clock,1502781,100.00,1.052,CPUs utilized CPU1,1.48,msec,cpu-clock,1476113,100.00,1.034,CPUs utilized ... results in 8 fields with 7 comma separators. On s390 the output of command: # ./perf stat -x, -A -a --no-merge -- true 0.95,msec,cpu-clock,949800,100.00,1.060,CPUs utilized ... results in 7 fields with 6 comma separators. Therefore this tests fails on s390. Similar issues exist for per-die and per-socket output which is not supported on s390. I have rewritten the python program to count commas in each output line into a bash function to achieve the same result. I hope this makes it a bit easier. Output before: # ./perf test -F 83 83: perf stat CSV output linter : Checking CSV output: no args [Success] Checking CSV output: system wide [Success] Checking CSV output: system wide Checking CSV output: \ system wide no aggregation 6.92,msec,cpu-clock,\ 6918131,100.00,6.972,CPUs utilized ... RuntimeError: wrong number of fields. expected 7 in \ 6.92,msec,cpu-clock,6918131,100.00,6.972,CPUs utilized FAILED! # Output after: # ./perf test -F 83 83: perf stat CSV output linter : Checking CSV output: no args [Success] Checking CSV output: system wide [Success] Checking CSV output: system wide Checking CSV output:\ system wide no aggregation [Success] Checking CSV output: interval [Success] Checking CSV output: event [Success] Checking CSV output: per core [Success] Checking CSV output: per thread [Success] Checking CSV output: per die [Success] Checking CSV output: per node [Success] Checking CSV output: per socket [Success] Ok # Committer notes: Continues to work on x86_64 $ perf test lint 89: perf stat CSV output linter : Ok $ perf test -v lint Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc 89: perf stat CSV output linter : --- start --- test child forked, pid 53133 Checking CSV output: no args [Success] Checking CSV output: system wide [Skip] paranoid and not root Checking CSV output: system wide [Skip] paranoid and not root Checking CSV output: interval [Success] Checking CSV output: event [Success] Checking CSV output: per core [Skip] paranoid and not root Checking CSV output: per thread [Skip] paranoid and not root Checking CSV output: per die [Skip] paranoid and not root Checking CSV output: per node [Skip] paranoid and not root Checking CSV output: per socket [Skip] paranoid and not root test child finished with 0 ---- end ---- perf stat CSV output linter: Ok $ Signed-off-by: Thomas Richter <tmricht@linux.ibm.com> Acked-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Claire Jensen <cjense@google.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Sumanth Korikkar <sumanthk@linux.ibm.com> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: linux390-list@tuxmaker.boeblingen.de.ibm.com Link: https://lore.kernel.org/r/20220603113034.2009728-1-tmricht@linux.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
1d98cdf7fa
commit
ec906102e5
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
# Basic sanity check of perf CSV output as specified in the man page.
|
||||
# Currently just checks the number of fields per line in output.
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('--no-args', action='store_true')
|
||||
ap.add_argument('--interval', action='store_true')
|
||||
ap.add_argument('--system-wide-no-aggr', action='store_true')
|
||||
ap.add_argument('--system-wide', action='store_true')
|
||||
ap.add_argument('--event', action='store_true')
|
||||
ap.add_argument('--per-core', action='store_true')
|
||||
ap.add_argument('--per-thread', action='store_true')
|
||||
ap.add_argument('--per-die', action='store_true')
|
||||
ap.add_argument('--per-node', action='store_true')
|
||||
ap.add_argument('--per-socket', action='store_true')
|
||||
ap.add_argument('--separator', default=',', nargs='?')
|
||||
args = ap.parse_args()
|
||||
|
||||
Lines = sys.stdin.readlines()
|
||||
|
||||
def check_csv_output(exp):
|
||||
for line in Lines:
|
||||
if 'failed' not in line:
|
||||
count = line.count(args.separator)
|
||||
if count != exp:
|
||||
sys.stdout.write(''.join(Lines))
|
||||
raise RuntimeError(f'wrong number of fields. expected {exp} in {line}')
|
||||
|
||||
try:
|
||||
if args.no_args or args.system_wide or args.event:
|
||||
expected_items = 6
|
||||
elif args.interval or args.per_thread or args.system_wide_no_aggr:
|
||||
expected_items = 7
|
||||
elif args.per_core or args.per_socket or args.per_node or args.per_die:
|
||||
expected_items = 8
|
||||
else:
|
||||
ap.print_help()
|
||||
raise RuntimeError('No checking option specified')
|
||||
check_csv_output(expected_items)
|
||||
|
||||
except:
|
||||
sys.stdout.write('Test failed for input: ' + ''.join(Lines))
|
||||
raise
|
|
@ -6,20 +6,41 @@
|
|||
|
||||
set -e
|
||||
|
||||
pythonchecker=$(dirname $0)/lib/perf_csv_output_lint.py
|
||||
if [ "x$PYTHON" == "x" ]
|
||||
then
|
||||
if which python3 > /dev/null
|
||||
then
|
||||
PYTHON=python3
|
||||
elif which python > /dev/null
|
||||
then
|
||||
PYTHON=python
|
||||
else
|
||||
echo Skipping test, python not detected please set environment variable PYTHON.
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
function commachecker()
|
||||
{
|
||||
local -i cnt=0 exp=0
|
||||
|
||||
case "$1"
|
||||
in "--no-args") exp=6
|
||||
;; "--system-wide") exp=6
|
||||
;; "--event") exp=6
|
||||
;; "--interval") exp=7
|
||||
;; "--per-thread") exp=7
|
||||
;; "--system-wide-no-aggr") exp=7
|
||||
[ $(uname -m) = "s390x" ] && exp=6
|
||||
;; "--per-core") exp=8
|
||||
;; "--per-socket") exp=8
|
||||
;; "--per-node") exp=8
|
||||
;; "--per-die") exp=8
|
||||
esac
|
||||
|
||||
while read line
|
||||
do
|
||||
# Check for lines beginning with Failed
|
||||
x=${line:0:6}
|
||||
[ "$x" = "Failed" ] && continue
|
||||
|
||||
# Count the number of commas
|
||||
x=$(echo $line | tr -d -c ',')
|
||||
cnt="${#x}"
|
||||
# echo $line $cnt
|
||||
[ "$cnt" -ne "$exp" ] && {
|
||||
echo "wrong number of fields. expected $exp in $line" 1>&2
|
||||
exit 1;
|
||||
}
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# Return true if perf_event_paranoid is > $1 and not running as root.
|
||||
function ParanoidAndNotRoot()
|
||||
|
@ -30,7 +51,7 @@ function ParanoidAndNotRoot()
|
|||
check_no_args()
|
||||
{
|
||||
echo -n "Checking CSV output: no args "
|
||||
perf stat -x, true 2>&1 | $PYTHON $pythonchecker --no-args
|
||||
perf stat -x, true 2>&1 | commachecker --no-args
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -42,7 +63,7 @@ check_system_wide()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, -a true 2>&1 | $PYTHON $pythonchecker --system-wide
|
||||
perf stat -x, -a true 2>&1 | commachecker --system-wide
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -55,14 +76,14 @@ check_system_wide_no_aggr()
|
|||
return
|
||||
fi
|
||||
echo -n "Checking CSV output: system wide no aggregation "
|
||||
perf stat -x, -A -a --no-merge true 2>&1 | $PYTHON $pythonchecker --system-wide-no-aggr
|
||||
perf stat -x, -A -a --no-merge true 2>&1 | commachecker --system-wide-no-aggr
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
check_interval()
|
||||
{
|
||||
echo -n "Checking CSV output: interval "
|
||||
perf stat -x, -I 1000 true 2>&1 | $PYTHON $pythonchecker --interval
|
||||
perf stat -x, -I 1000 true 2>&1 | commachecker --interval
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -70,7 +91,7 @@ check_interval()
|
|||
check_event()
|
||||
{
|
||||
echo -n "Checking CSV output: event "
|
||||
perf stat -x, -e cpu-clock true 2>&1 | $PYTHON $pythonchecker --event
|
||||
perf stat -x, -e cpu-clock true 2>&1 | commachecker --event
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -82,7 +103,7 @@ check_per_core()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, --per-core -a true 2>&1 | $PYTHON $pythonchecker --per-core
|
||||
perf stat -x, --per-core -a true 2>&1 | commachecker --per-core
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -94,7 +115,7 @@ check_per_thread()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, --per-thread -a true 2>&1 | $PYTHON $pythonchecker --per-thread
|
||||
perf stat -x, --per-thread -a true 2>&1 | commachecker --per-thread
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -106,7 +127,7 @@ check_per_die()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, --per-die -a true 2>&1 | $PYTHON $pythonchecker --per-die
|
||||
perf stat -x, --per-die -a true 2>&1 | commachecker --per-die
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -118,7 +139,7 @@ check_per_node()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, --per-node -a true 2>&1 | $PYTHON $pythonchecker --per-node
|
||||
perf stat -x, --per-node -a true 2>&1 | commachecker --per-node
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
@ -130,7 +151,7 @@ check_per_socket()
|
|||
echo "[Skip] paranoid and not root"
|
||||
return
|
||||
fi
|
||||
perf stat -x, --per-socket -a true 2>&1 | $PYTHON $pythonchecker --per-socket
|
||||
perf stat -x, --per-socket -a true 2>&1 | commachecker --per-socket
|
||||
echo "[Success]"
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue