diff --git a/qemu/tests/cfg/numa_opts.cfg b/qemu/tests/cfg/numa_opts.cfg new file mode 100644 index 0000000000000000000000000000000000000000..1a1a03d0c544b77b4ed06d7aae371fd806ad6818 --- /dev/null +++ b/qemu/tests/cfg/numa_opts.cfg @@ -0,0 +1,80 @@ +- numa_opts: + type = numa_opts + # we will start the VM manually, because we will + # manually override the "mem" parameter before starting it + start_vm = no + # paused VMs are enough for our purposes, no need to boot them: + paused_after_start_vm = yes + kill_vm = yes + kill_vm_gracefully = no + encode_video_files = no + + variants: + - nodes.0: + # no extra parameters => zero nodes + numa_nodes = 0 + - nodes.1: + smp_override = 6 + mem_override = 256 + numa_nodes = 1 + extra_params += " -numa node" + numa_node0_cpus = "0 1 2 3 4 5" + numa_node0_size = 256 + - nodes.2: + smp_override = 6 + mem_override = 256 + numa_nodes = 2 + variants: + # default (interleaved) mode: + - defaults: + extra_params += " -numa node -numa node" + numa_node0_cpus = "0 2 4" + numa_node0_size = 128 + numa_node1_cpus = "1 3 5" + numa_node1_size = 128 + # custom memory and CPU values: + - custom_values: + numa_node0_cpus = "4 5" + numa_node0_size = 100 + numa_node1_cpus = "0 1 2 3" + numa_node1_size = 156 + variants: + - implicit_ids: + extra_params += " -numa node,mem=100,cpus=4-5" + extra_params += " -numa node,mem=156,cpus=0-3" + - unordered_ids: + extra_params += " -numa node,mem=156,cpus=0-3,nodeid=1" + extra_params += " -numa node,mem=100,cpus=4-5,nodeid=0" + - nodes.3: + smp_override = 6 + mem_override = 256 + numa_nodes = 3 + variants: + # default (interleaved) mode: + - defaults: + extra_params += " -numa node -numa node -numa node" + # nodes are 8MB-aligned: + numa_node0_cpus = "0 3" + numa_node0_size = 80 + numa_node1_cpus = "1 4" + numa_node1_size = 80 + numa_node2_cpus = "2 5" + # the last node gets all the remaining: + numa_node2_size = 96 + # custom memory and CPU values: + - custom_values: + numa_node0_cpus = "3 4" + numa_node0_size = 50 + numa_node1_cpus = "0 1 2" + numa_node1_size = 100 + numa_node2_cpus = "5" + numa_node2_size = 106 + variants: + - implicit_ids: + extra_params += " -numa node,mem=50,cpus=3-4" + extra_params += " -numa node,mem=100,cpus=0-2" + extra_params += " -numa node,mem=106,cpus=5" + - unordered_ids: + extra_params += " -numa node,mem=106,cpus=5,nodeid=2" + extra_params += " -numa node,mem=50,cpus=3-4,nodeid=0" + extra_params += " -numa node,mem=100,cpus=0-2,nodeid=1" diff --git a/qemu/tests/numa_opts.py b/qemu/tests/numa_opts.py new file mode 100644 index 0000000000000000000000000000000000000000..828471e72b68da5aacf3c1b7503d007cd56d0fd7 --- /dev/null +++ b/qemu/tests/numa_opts.py @@ -0,0 +1,55 @@ +from autotest.client.shared import error +from virttest import qemu_vm + +import logging +logger = logging.getLogger(__name__) +dbg = logger.debug + +def run_numa_opts(test, params, env): + """ + Simple test to check if NUMA options are being parsed properly + + This _does not_ test if NUMA information is being properly exposed to the + guest. + """ + + dbg("starting numa_opts test...") + + # work around a test runner bug that makes it override test-specific "mem" + # and "smp" options unconditionally, so we override them manually if + # necessary, using the mem_override/smp_override options: + mem_override = params.get("mem_override") + if mem_override: + params["mem"] = mem_override + smp_override = params.get("smp_override") + if smp_override: + params["smp"] = smp_override + + # we start the VM manually because of the mem/smp workaround above: + vm = env.get_vm(params.get("main_vm")) + vm.create(params=params) + + numa = vm.monitors[0].info_numa() + dbg("info numa reply: %r", numa) + + numa_nodes = params.get("numa_nodes") + if numa_nodes: + numa_nodes = int(params.get("numa_nodes")) + if len(numa) <> numa_nodes: + raise error.TestFail("Wrong number of numa nodes: %d. Expected: %d" % \ + (len(numa), numa_nodes)) + + for nodenr,node in enumerate(numa): + size = params.get("numa_node%d_size" % (nodenr)) + if size is not None: + size = int(size) + if size != numa[nodenr][0]: + raise error.TestFail("Wrong size of numa node %d: %d. Expected: %d" % \ + (nodenr, numa[nodenr][0], size)) + + cpus = params.get("numa_node%d_cpus" % (nodenr)) + if cpus is not None: + cpus = set([int(v) for v in cpus.split()]) + if cpus <> numa[nodenr][1]: + raise error.TestFail("Wrong CPU set on numa node %d: %s. Expected: %s" % \ + (nodenr, numa[nodenr][1], cpus))