We already do check that if there's <memory mode='restrictive'/> then all <memnode/> have to be of 'restrictive' mode too. But what we are missing the reverse: if there is <memnode/> with 'restrictive' mode, then the <memory/> has to be of the same mode too. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2208946 Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/conf/numa_conf.c | 20 ++++++--- ...strictive-mode-err-mixed.x86_64-latest.err | 1 + ...une-memnode-restrictive-mode-err-mixed.xml | 41 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.x86_64-latest.err create mode 100644 tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.xml diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 6095139385..a616521763 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -1075,12 +1075,20 @@ virDomainNumaDefValidate(const virDomainNuma *def) const virDomainNumaNode *node = &def->mem_nodes[i]; g_autoptr(virBitmap) levelsSeen = virBitmapNew(0); - if (virDomainNumatuneNodeSpecified(def, i) && - def->memory.mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE && - node->mode != VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("'restrictive' mode is required in memnode element when mode is 'restrictive' in memory element")); - return -1; + if (virDomainNumatuneNodeSpecified(def, i)) { + if (def->memory.mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE && + node->mode != VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("'restrictive' mode is required in memnode element when mode is 'restrictive' in memory element")); + return -1; + } + + if (node->mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE && + def->memory.mode != VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("'restrictive' mode is required in memory element when mode is 'restrictive' in memnode element")); + return -1; + } } for (j = 0; j < node->ncaches; j++) { diff --git a/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.x86_64-latest.err b/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.x86_64-latest.err new file mode 100644 index 0000000000..88f02ee70e --- /dev/null +++ b/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.x86_64-latest.err @@ -0,0 +1 @@ +XML error: 'restrictive' mode is required in memory element when mode is 'restrictive' in memnode element diff --git a/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.xml b/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.xml new file mode 100644 index 0000000000..0304dec8ef --- /dev/null +++ b/tests/qemuxml2argvdata/numatune-memnode-restrictive-mode-err-mixed.xml @@ -0,0 +1,41 @@ +<domain type='qemu'> + <name>QEMUGuest</name> + <uuid>9f4b6512-e73a-4a25-93e8-5307802821ce</uuid> + <memory unit='KiB'>24682468</memory> + <currentMemory unit='KiB'>24682468</currentMemory> + <vcpu placement='static'>32</vcpu> + <numatune> + <memory mode='interleave' nodeset='0-3'/> + <memnode cellid='0' mode='strict' nodeset='3'/> + <memnode cellid='2' mode='restrictive' nodeset='1-2'/> + </numatune> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + <numa> + <cell id='0' cpus='0' memory='20002' unit='KiB'/> + <cell id='1' cpus='1-27,29' memory='660066' unit='KiB'/> + <cell id='2' cpus='28,30-31' memory='24002400' unit='KiB'/> + </numa> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 93d5ae018f..2cc9bd074a 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1868,6 +1868,7 @@ mymain(void) DO_TEST_CAPS_LATEST("numatune-memnode"); DO_TEST_PARSE_ERROR_NOCAPS("numatune-memnode-invalid-mode"); DO_TEST_CAPS_LATEST("numatune-memnode-restrictive-mode"); + DO_TEST_CAPS_LATEST_PARSE_ERROR("numatune-memnode-restrictive-mode-err-mixed"); DO_TEST_CAPS_LATEST("numatune-system-memory"); DO_TEST_NOCAPS("numatune-memnode-no-memory"); -- 2.39.3