On 11/14/2017 04:13 PM, Peter Krempa wrote: > On Tue, Nov 14, 2017 at 15:47:39 +0100, Michal Privoznik wrote: >> Since we already have such support for libxl all we need is qemu >> driver adjustment. And a test case. >> >> Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> >> --- >> src/qemu/qemu_command.c | 36 +++++++++++- >> .../qemuxml2argv-numatune-distances.args | 63 +++++++++++++++++++++ >> .../qemuxml2argv-numatune-distances.xml | 65 ++++++++++++++++++++++ >> tests/qemuxml2argvtest.c | 2 + >> 4 files changed, 165 insertions(+), 1 deletion(-) >> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.args >> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.xml >> >> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c >> index eb72db33b..8b9daaea3 100644 >> --- a/src/qemu/qemu_command.c >> +++ b/src/qemu/qemu_command.c >> @@ -7675,7 +7675,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, >> virCommandPtr cmd, >> qemuDomainObjPrivatePtr priv) >> { >> - size_t i; >> + size_t i, j; >> virQEMUCapsPtr qemuCaps = priv->qemuCaps; >> virBuffer buf = VIR_BUFFER_INITIALIZER; >> char *cpumask = NULL, *tmpmask = NULL, *next = NULL; >> @@ -7685,6 +7685,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, >> int ret = -1; >> size_t ncells = virDomainNumaGetNodeCount(def->numa); >> const long system_page_size = virGetSystemPageSizeKB(); >> + bool numa_distances = false; >> >> if (virDomainNumatuneHasPerNodeBinding(def->numa) && >> !(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) || >> @@ -7793,6 +7794,39 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, >> >> virCommandAddArgBuffer(cmd, &buf); >> } >> + >> + /* If NUMA node distance is specified for at least one pair >> + * of nodes, we have to specify all the distances. Even >> + * though they might be the default ones. */ >> + for (i = 0; i < ncells; i++) { >> + for (j = 0; j < ncells; j++) { >> + if (!virDomainNumaNodeDistanceSpecified(def->numa, i, j)) >> + continue; >> + >> + numa_distances = true; >> + >> + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { >> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", >> + _("setting NUMA distances is not " >> + "supported with this qemu")); >> + goto cleanup; > > This capability does not need to be checked in the loop. Also the loop > does not make sense to be finished once you deduct that 'numa_distances' > is true. Ah. Correct. Consider this squashed in then: diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c index 8b9daaea3..bceafb084 100644 --- i/src/qemu/qemu_command.c +++ w/src/qemu/qemu_command.c @@ -7804,17 +7804,18 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, continue; numa_distances = true; - - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("setting NUMA distances is not " - "supported with this qemu")); - goto cleanup; - } + break; } } if (numa_distances) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("setting NUMA distances is not " + "supported with this qemu")); + goto cleanup; + } + for (i = 0; i < ncells; i++) { for (j = 0; j < ncells; j++) { size_t distance = virDomainNumaGetNodeDistance(def->numa, i, j); Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list