Commit ec906102 authored by Thomas Richter's avatar Thomas Richter Committed by Arnaldo Carvalho de Melo

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: default avatarThomas Richter <tmricht@linux.ibm.com>
Acked-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarArnaldo 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 1d98cdf7
#!/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 @@ ...@@ -6,20 +6,41 @@
set -e set -e
pythonchecker=$(dirname $0)/lib/perf_csv_output_lint.py function commachecker()
if [ "x$PYTHON" == "x" ] {
then local -i cnt=0 exp=0
if which python3 > /dev/null
then case "$1"
PYTHON=python3 in "--no-args") exp=6
elif which python > /dev/null ;; "--system-wide") exp=6
then ;; "--event") exp=6
PYTHON=python ;; "--interval") exp=7
else ;; "--per-thread") exp=7
echo Skipping test, python not detected please set environment variable PYTHON. ;; "--system-wide-no-aggr") exp=7
exit 2 [ $(uname -m) = "s390x" ] && exp=6
fi ;; "--per-core") exp=8
fi ;; "--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. # Return true if perf_event_paranoid is > $1 and not running as root.
function ParanoidAndNotRoot() function ParanoidAndNotRoot()
...@@ -30,7 +51,7 @@ function ParanoidAndNotRoot() ...@@ -30,7 +51,7 @@ function ParanoidAndNotRoot()
check_no_args() check_no_args()
{ {
echo -n "Checking CSV output: 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]" echo "[Success]"
} }
...@@ -42,7 +63,7 @@ check_system_wide() ...@@ -42,7 +63,7 @@ check_system_wide()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi fi
perf stat -x, -a true 2>&1 | $PYTHON $pythonchecker --system-wide perf stat -x, -a true 2>&1 | commachecker --system-wide
echo "[Success]" echo "[Success]"
} }
...@@ -55,14 +76,14 @@ check_system_wide_no_aggr() ...@@ -55,14 +76,14 @@ check_system_wide_no_aggr()
return return
fi fi
echo -n "Checking CSV output: system wide no aggregation " 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]" echo "[Success]"
} }
check_interval() check_interval()
{ {
echo -n "Checking CSV output: 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]" echo "[Success]"
} }
...@@ -70,7 +91,7 @@ check_interval() ...@@ -70,7 +91,7 @@ check_interval()
check_event() check_event()
{ {
echo -n "Checking CSV output: 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]" echo "[Success]"
} }
...@@ -82,7 +103,7 @@ check_per_core() ...@@ -82,7 +103,7 @@ check_per_core()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi 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]" echo "[Success]"
} }
...@@ -94,7 +115,7 @@ check_per_thread() ...@@ -94,7 +115,7 @@ check_per_thread()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi 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]" echo "[Success]"
} }
...@@ -106,7 +127,7 @@ check_per_die() ...@@ -106,7 +127,7 @@ check_per_die()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi 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]" echo "[Success]"
} }
...@@ -118,7 +139,7 @@ check_per_node() ...@@ -118,7 +139,7 @@ check_per_node()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi 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]" echo "[Success]"
} }
...@@ -130,7 +151,7 @@ check_per_socket() ...@@ -130,7 +151,7 @@ check_per_socket()
echo "[Skip] paranoid and not root" echo "[Skip] paranoid and not root"
return return
fi 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]" echo "[Success]"
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment