On 11/22/2017 04:45 AM, Michal Privoznik wrote: > On 11/22/2017 01:04 AM, John Ferlan wrote: >> >> >> On 11/14/2017 09:47 AM, 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; >>> + } >>> + } >>> + } >> >> Not sure I understand the need for the above double loop.... Even with >> your adjustment... >> >> It would seem that all that's necessary is >> >> for (i < 0; i < ncells; i++) { >> if (numa->mem_nodes[i].ndistances > 0) > > It things only were so simple. Thing is, numa is a private struct. We > need accessors for getting any value. I can't just dereference numa > struct from qemu code. Oh right... Could have another accessor too, but your need is a bit more specific especially since as you point out next qemu will default to 10 and 20... Still I think with the different name this will make more sense in v2. > > That's why I'm introducing an accessor in 2/5. Moreover, in case all > values are defaults I wanted to not put them onto the cmd line. The > advantage would be that it would work even with older qemu which doesn't > have the capability. I mean, qemu does follow the spec and if no > distances are provided it uses the ones from the spec (10 and 20). > Nothing is ever so simple, but I did ask if I was in the weeds too basically because I've learned over time that simplicity and numa are not synonymous! John -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list