89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
# SPDX-License-Identifier: GPL-2.0+
 | 
						|
#
 | 
						|
# Create an awk script that takes as input numbers of CPUs and outputs
 | 
						|
# lists of CPUs, one per line in both cases.
 | 
						|
#
 | 
						|
# Usage: kvm-get-cpus-script.sh /path/to/cpu/arrays /path/to/put/script [ /path/to/state ]
 | 
						|
#
 | 
						|
# The CPU arrays are output by kvm-assign-cpus.sh, and are valid awk
 | 
						|
# statements initializing the variables describing the system's topology.
 | 
						|
#
 | 
						|
# The optional state is input by this script (if the file exists and is
 | 
						|
# non-empty), and can also be output by this script.
 | 
						|
 | 
						|
cpuarrays="${1-/sys/devices/system/node}"
 | 
						|
scriptfile="${2}"
 | 
						|
statefile="${3}"
 | 
						|
 | 
						|
if ! test -f "$cpuarrays"
 | 
						|
then
 | 
						|
	echo "File not found: $cpuarrays" 1>&2
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
scriptdir="`dirname "$scriptfile"`"
 | 
						|
if ! test -d "$scriptdir" || ! test -x "$scriptdir" || ! test -w "$scriptdir"
 | 
						|
then
 | 
						|
	echo "Directory not usable for script output: $scriptdir"
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
cat << '___EOF___' > "$scriptfile"
 | 
						|
BEGIN {
 | 
						|
___EOF___
 | 
						|
cat "$cpuarrays" >> "$scriptfile"
 | 
						|
if test -r "$statefile"
 | 
						|
then
 | 
						|
	cat "$statefile" >> "$scriptfile"
 | 
						|
fi
 | 
						|
cat << '___EOF___' >> "$scriptfile"
 | 
						|
}
 | 
						|
 | 
						|
# Do we have the system architecture to guide CPU affinity?
 | 
						|
function gotcpus()
 | 
						|
{
 | 
						|
	return numnodes != "";
 | 
						|
}
 | 
						|
 | 
						|
# Return a comma-separated list of the next n CPUs.
 | 
						|
function nextcpus(n,  i, s)
 | 
						|
{
 | 
						|
	for (i = 0; i < n; i++) {
 | 
						|
		if (nodecpus[curnode] == "")
 | 
						|
			curnode = 0;
 | 
						|
		if (cpu[curnode][curcpu[curnode]] == "")
 | 
						|
			curcpu[curnode] = 0;
 | 
						|
		if (s != "")
 | 
						|
			s = s ",";
 | 
						|
		s = s cpu[curnode][curcpu[curnode]];
 | 
						|
		curcpu[curnode]++;
 | 
						|
		curnode++
 | 
						|
	}
 | 
						|
	return s;
 | 
						|
}
 | 
						|
 | 
						|
# Dump out the current node/CPU state so that a later invocation of this
 | 
						|
# script can continue where this one left off.  Of course, this only works
 | 
						|
# when a state file was specified and where there was valid sysfs state.
 | 
						|
# Returns 1 if the state was dumped, 0 otherwise.
 | 
						|
#
 | 
						|
# Dumping the state for one system configuration and loading it into
 | 
						|
# another isn't likely to do what you want, whatever that might be.
 | 
						|
function dumpcpustate(  i, fn)
 | 
						|
{
 | 
						|
___EOF___
 | 
						|
echo '	fn = "'"$statefile"'";' >> $scriptfile
 | 
						|
cat << '___EOF___' >> "$scriptfile"
 | 
						|
	if (fn != "" && gotcpus()) {
 | 
						|
		print "curnode = " curnode ";" > fn;
 | 
						|
		for (i = 0; i < numnodes; i++)
 | 
						|
			if (curcpu[i] != "")
 | 
						|
				print "curcpu[" i "] = " curcpu[i] ";" >> fn;
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
	if (fn != "")
 | 
						|
		print "# No CPU state to dump." > fn;
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
___EOF___
 |