162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Analyze a given results directory for refscale performance measurements.
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Usage: kvm-recheck-refscale.sh resdir
762306a36Sopenharmony_ci#
862306a36Sopenharmony_ci# Copyright (C) IBM Corporation, 2016
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cii="$1"
1362306a36Sopenharmony_ciif test -d "$i" -a -r "$i"
1462306a36Sopenharmony_cithen
1562306a36Sopenharmony_ci	:
1662306a36Sopenharmony_cielse
1762306a36Sopenharmony_ci	echo Unreadable results directory: $i
1862306a36Sopenharmony_ci	exit 1
1962306a36Sopenharmony_cifi
2062306a36Sopenharmony_ciPATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH
2162306a36Sopenharmony_ci. functions.sh
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciconfigfile=`echo $i | sed -e 's/^.*\///'`
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cised -e 's/^\[[^]]*]//' < $i/console.log | tr -d '\015' |
2662306a36Sopenharmony_ciawk -v configfile="$configfile" '
2762306a36Sopenharmony_ci/^[ 	]*Runs	Time\(ns\) *$/ {
2862306a36Sopenharmony_ci	if (dataphase + 0 == 0) {
2962306a36Sopenharmony_ci		dataphase = 1;
3062306a36Sopenharmony_ci		# print configfile, $0;
3162306a36Sopenharmony_ci	}
3262306a36Sopenharmony_ci	next;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/[^ 	]*[0-9][0-9]*	[0-9][0-9]*\.[0-9][0-9]*$/ {
3662306a36Sopenharmony_ci	if (dataphase == 1) {
3762306a36Sopenharmony_ci		# print $0;
3862306a36Sopenharmony_ci		readertimes[++n] = $2;
3962306a36Sopenharmony_ci		sum += $2;
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci	next;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	if (dataphase == 1)
4662306a36Sopenharmony_ci		dataphase == 2;
4762306a36Sopenharmony_ci	next;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciEND {
5162306a36Sopenharmony_ci	print configfile " results:";
5262306a36Sopenharmony_ci	newNR = asort(readertimes);
5362306a36Sopenharmony_ci	if (newNR <= 0) {
5462306a36Sopenharmony_ci		print "No refscale records found???"
5562306a36Sopenharmony_ci		exit;
5662306a36Sopenharmony_ci	}
5762306a36Sopenharmony_ci	medianidx = int(newNR / 2);
5862306a36Sopenharmony_ci	if (newNR == medianidx * 2)
5962306a36Sopenharmony_ci		medianvalue = (readertimes[medianidx - 1] + readertimes[medianidx]) / 2;
6062306a36Sopenharmony_ci	else
6162306a36Sopenharmony_ci		medianvalue = readertimes[medianidx];
6262306a36Sopenharmony_ci	points = "Points:";
6362306a36Sopenharmony_ci	for (i = 1; i <= newNR; i++)
6462306a36Sopenharmony_ci		points = points " " readertimes[i];
6562306a36Sopenharmony_ci	print points;
6662306a36Sopenharmony_ci	print "Average reader duration: " sum / newNR " nanoseconds";
6762306a36Sopenharmony_ci	print "Minimum reader duration: " readertimes[1];
6862306a36Sopenharmony_ci	print "Median reader duration: " medianvalue;
6962306a36Sopenharmony_ci	print "Maximum reader duration: " readertimes[newNR];
7062306a36Sopenharmony_ci	print "Computed from refscale printk output.";
7162306a36Sopenharmony_ci}'
72