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