1f71d8311SPaul E. McKenney#!/bin/bash
2f71d8311SPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+
3f71d8311SPaul E. McKenney#
4f71d8311SPaul E. McKenney# Analyze a given results directory for refscale performance measurements.
5f71d8311SPaul E. McKenney#
6f71d8311SPaul E. McKenney# Usage: kvm-recheck-refscale.sh resdir
7f71d8311SPaul E. McKenney#
8f71d8311SPaul E. McKenney# Copyright (C) IBM Corporation, 2016
9f71d8311SPaul E. McKenney#
10f71d8311SPaul E. McKenney# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
11f71d8311SPaul E. McKenney
12f71d8311SPaul E. McKenneyi="$1"
13f71d8311SPaul E. McKenneyif test -d "$i" -a -r "$i"
14f71d8311SPaul E. McKenneythen
15f71d8311SPaul E. McKenney	:
16f71d8311SPaul E. McKenneyelse
17f71d8311SPaul E. McKenney	echo Unreadable results directory: $i
18f71d8311SPaul E. McKenney	exit 1
19f71d8311SPaul E. McKenneyfi
20f71d8311SPaul E. McKenneyPATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH
21f71d8311SPaul E. McKenney. functions.sh
22f71d8311SPaul E. McKenney
23f71d8311SPaul E. McKenneyconfigfile=`echo $i | sed -e 's/^.*\///'`
24f71d8311SPaul E. McKenney
25f71d8311SPaul E. McKenneysed -e 's/^\[[^]]*]//' < $i/console.log | tr -d '\015' |
26f71d8311SPaul E. McKenneyawk -v configfile="$configfile" '
27f71d8311SPaul E. McKenney/^[ 	]*Runs	Time\(ns\) *$/ {
28f71d8311SPaul E. McKenney	if (dataphase + 0 == 0) {
29f71d8311SPaul E. McKenney		dataphase = 1;
30f71d8311SPaul E. McKenney		# print configfile, $0;
31f71d8311SPaul E. McKenney	}
32f71d8311SPaul E. McKenney	next;
33f71d8311SPaul E. McKenney}
34f71d8311SPaul E. McKenney
35f71d8311SPaul E. McKenney/[^ 	]*[0-9][0-9]*	[0-9][0-9]*\.[0-9][0-9]*$/ {
36f71d8311SPaul E. McKenney	if (dataphase == 1) {
37f71d8311SPaul E. McKenney		# print $0;
38f71d8311SPaul E. McKenney		readertimes[++n] = $2;
39f71d8311SPaul E. McKenney		sum += $2;
40f71d8311SPaul E. McKenney	}
41f71d8311SPaul E. McKenney	next;
42f71d8311SPaul E. McKenney}
43f71d8311SPaul E. McKenney
44f71d8311SPaul E. McKenney{
45f71d8311SPaul E. McKenney	if (dataphase == 1)
46f71d8311SPaul E. McKenney		dataphase == 2;
47f71d8311SPaul E. McKenney	next;
48f71d8311SPaul E. McKenney}
49f71d8311SPaul E. McKenney
50f71d8311SPaul E. McKenneyEND {
51f71d8311SPaul E. McKenney	print configfile " results:";
52f71d8311SPaul E. McKenney	newNR = asort(readertimes);
53f71d8311SPaul E. McKenney	if (newNR <= 0) {
54f71d8311SPaul E. McKenney		print "No refscale records found???"
55f71d8311SPaul E. McKenney		exit;
56f71d8311SPaul E. McKenney	}
57f71d8311SPaul E. McKenney	medianidx = int(newNR / 2);
58f71d8311SPaul E. McKenney	if (newNR == medianidx * 2)
59f71d8311SPaul E. McKenney		medianvalue = (readertimes[medianidx - 1] + readertimes[medianidx]) / 2;
60f71d8311SPaul E. McKenney	else
61f71d8311SPaul E. McKenney		medianvalue = readertimes[medianidx];
62f71d8311SPaul E. McKenney	points = "Points:";
63f71d8311SPaul E. McKenney	for (i = 1; i <= newNR; i++)
64f71d8311SPaul E. McKenney		points = points " " readertimes[i];
65f71d8311SPaul E. McKenney	print points;
66f71d8311SPaul E. McKenney	print "Average reader duration: " sum / newNR " nanoseconds";
67f71d8311SPaul E. McKenney	print "Minimum reader duration: " readertimes[1];
68f71d8311SPaul E. McKenney	print "Median reader duration: " medianvalue;
69f71d8311SPaul E. McKenney	print "Maximum reader duration: " readertimes[newNR];
70f71d8311SPaul E. McKenney	print "Computed from refscale printk output.";
71f71d8311SPaul E. McKenney}'
72