xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Analyze a given results directory for rcuscale scalability measurements.
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# Usage: kvm-recheck-rcuscale.sh resdir
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Copyright (C) IBM Corporation, 2016
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyuni="$1"
13*4882a593Smuzhiyunif test -d "$i" -a -r "$i"
14*4882a593Smuzhiyunthen
15*4882a593Smuzhiyun	:
16*4882a593Smuzhiyunelse
17*4882a593Smuzhiyun	echo Unreadable results directory: $i
18*4882a593Smuzhiyun	exit 1
19*4882a593Smuzhiyunfi
20*4882a593SmuzhiyunPATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH
21*4882a593Smuzhiyun. functions.sh
22*4882a593Smuzhiyun
23*4882a593Smuzhiyunif kvm-recheck-rcuscale-ftrace.sh $i
24*4882a593Smuzhiyunthen
25*4882a593Smuzhiyun	# ftrace data was successfully analyzed, call it good!
26*4882a593Smuzhiyun	exit 0
27*4882a593Smuzhiyunfi
28*4882a593Smuzhiyun
29*4882a593Smuzhiyunconfigfile=`echo $i | sed -e 's/^.*\///'`
30*4882a593Smuzhiyun
31*4882a593Smuzhiyunsed -e 's/^\[[^]]*]//' < $i/console.log |
32*4882a593Smuzhiyunawk '
33*4882a593Smuzhiyun/-scale: .* gps: .* batches:/ {
34*4882a593Smuzhiyun	ngps = $9;
35*4882a593Smuzhiyun	nbatches = $11;
36*4882a593Smuzhiyun}
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun/-scale: .*writer-duration/ {
39*4882a593Smuzhiyun	gptimes[++n] = $5 / 1000.;
40*4882a593Smuzhiyun	sum += $5 / 1000.;
41*4882a593Smuzhiyun}
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunEND {
44*4882a593Smuzhiyun	newNR = asort(gptimes);
45*4882a593Smuzhiyun	if (newNR <= 0) {
46*4882a593Smuzhiyun		print "No rcuscale records found???"
47*4882a593Smuzhiyun		exit;
48*4882a593Smuzhiyun	}
49*4882a593Smuzhiyun	pct50 = int(newNR * 50 / 100);
50*4882a593Smuzhiyun	if (pct50 < 1)
51*4882a593Smuzhiyun		pct50 = 1;
52*4882a593Smuzhiyun	pct90 = int(newNR * 90 / 100);
53*4882a593Smuzhiyun	if (pct90 < 1)
54*4882a593Smuzhiyun		pct90 = 1;
55*4882a593Smuzhiyun	pct99 = int(newNR * 99 / 100);
56*4882a593Smuzhiyun	if (pct99 < 1)
57*4882a593Smuzhiyun		pct99 = 1;
58*4882a593Smuzhiyun	div = 10 ** int(log(gptimes[pct90]) / log(10) + .5) / 100;
59*4882a593Smuzhiyun	print "Histogram bucket size: " div;
60*4882a593Smuzhiyun	last = gptimes[1] - 10;
61*4882a593Smuzhiyun	count = 0;
62*4882a593Smuzhiyun	for (i = 1; i <= newNR; i++) {
63*4882a593Smuzhiyun		current = div * int(gptimes[i] / div);
64*4882a593Smuzhiyun		if (last == current) {
65*4882a593Smuzhiyun			count++;
66*4882a593Smuzhiyun		} else {
67*4882a593Smuzhiyun			if (count > 0)
68*4882a593Smuzhiyun				print last, count;
69*4882a593Smuzhiyun			count = 1;
70*4882a593Smuzhiyun			last = current;
71*4882a593Smuzhiyun		}
72*4882a593Smuzhiyun	}
73*4882a593Smuzhiyun	if (count > 0)
74*4882a593Smuzhiyun		print last, count;
75*4882a593Smuzhiyun	print "Average grace-period duration: " sum / newNR " microseconds";
76*4882a593Smuzhiyun	print "Minimum grace-period duration: " gptimes[1];
77*4882a593Smuzhiyun	print "50th percentile grace-period duration: " gptimes[pct50];
78*4882a593Smuzhiyun	print "90th percentile grace-period duration: " gptimes[pct90];
79*4882a593Smuzhiyun	print "99th percentile grace-period duration: " gptimes[pct99];
80*4882a593Smuzhiyun	print "Maximum grace-period duration: " gptimes[newNR];
81*4882a593Smuzhiyun	print "Grace periods: " ngps + 0 " Batches: " nbatches + 0 " Ratio: " ngps / nbatches;
82*4882a593Smuzhiyun	print "Computed from rcuscale printk output.";
83*4882a593Smuzhiyun}'
84