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(a)redhat.com>
> ---
> 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