brintos

brintos / linux-shallow public Read only

0
0
Text · 2.2 KiB · fd1ffaa Raw
101 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.0+3#4# Alternate sleeping and spinning on randomly selected CPUs.  The purpose5# of this script is to inflict random OS jitter on a concurrently running6# test.7#8# Usage: jitter.sh me jittering-path duration [ sleepmax [ spinmax ] ]9#10# me: Random-number-generator seed salt.11# duration: Time to run in seconds.12# jittering-path: Path to file whose removal will stop this script.13# sleepmax: Maximum microseconds to sleep, defaults to one second.14# spinmax: Maximum microseconds to spin, defaults to one millisecond.15#16# Copyright (C) IBM Corporation, 201617#18# Authors: Paul E. McKenney <paulmck@linux.ibm.com>19 20me=$(($1 * 1000))21jittering=$222duration=$323sleepmax=${4-1000000}24spinmax=${5-1000}25 26n=127 28starttime=`gawk 'BEGIN { print systime(); }' < /dev/null`29 30nohotplugcpus=31for i in /sys/devices/system/cpu/cpu[0-9]*32do33	if test -f $i/online34	then35		:36	else37		curcpu=`echo $i | sed -e 's/^[^0-9]*//'`38		nohotplugcpus="$nohotplugcpus $curcpu"39	fi40done41 42while :43do44	# Check for done.45	t=`gawk -v s=$starttime 'BEGIN { print systime() - s; }' < /dev/null`46	if test "$t" -gt "$duration"47	then48		exit 0;49	fi50 51	# Check for stop request.52	if ! test -f "$jittering"53	then54		exit 1;55	fi56 57	# Set affinity to randomly selected online CPU58	if cpus=`grep 1 /sys/devices/system/cpu/*/online 2>&1 |59		 sed -e 's,/[^/]*$,,' -e 's/^[^0-9]*//'`60	then61		:62	else63		cpus=64	fi65	# Do not leave out non-hot-pluggable CPUs66	cpus="$cpus $nohotplugcpus"67 68	cpumask=`awk -v cpus="$cpus" -v me=$me -v n=$n 'BEGIN {69		srand(n + me + systime());70		ncpus = split(cpus, ca);71		print ca[int(rand() * ncpus + 1)];72	}' < /dev/null`73	n=$(($n+1))74	if ! taskset -c -p $cpumask $$ > /dev/null 2>&175	then76		echo taskset failure: '"taskset -c -p ' $cpumask $$ '"'77		exit 178	fi79 80	# Sleep a random duration81	sleeptime=`awk -v me=$me -v n=$n -v sleepmax=$sleepmax 'BEGIN {82		srand(n + me + systime());83		printf("%06d", int(rand() * sleepmax));84	}' < /dev/null`85	n=$(($n+1))86	sleep .$sleeptime87 88	# Spin a random duration89	limit=`awk -v me=$me -v n=$n -v spinmax=$spinmax 'BEGIN {90		srand(n + me + systime());91		printf("%06d", int(rand() * spinmax));92	}' < /dev/null`93	n=$(($n+1))94	for i in {1..$limit}95	do96		echo > /dev/null97	done98done99 100exit 1101