| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #!/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___
|