This API does not work well on domains without <numatune/>. It blindly
reports misleading info on a shutoff domain:
# virsh numatune rhel7
numa_mode : strict
numa_nodeset :
This is obviously wrong as long as there's no numatune for rhel7
domain, which isn't. What we should do, is report only those NUMA
parameters, that domain has defined.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_driver.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index e7f235b..9b3bc68 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -10522,13 +10522,14 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
unsigned int flags)
{
virQEMUDriverPtr driver = dom->conn->privateData;
- size_t i;
+ size_t i, j;
virDomainObjPtr vm = NULL;
virDomainDefPtr persistentDef = NULL;
char *nodeset = NULL;
int ret = -1;
virCapsPtr caps = NULL;
virDomainDefPtr def = NULL;
+ bool hasNumatune;
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
VIR_DOMAIN_AFFECT_CONFIG |
@@ -10552,31 +10553,40 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
&persistentDef) < 0)
goto cleanup;
- if ((*nparams) == 0) {
- *nparams = QEMU_NB_NUMA_PARAM;
- ret = 0;
- goto cleanup;
- }
-
if (flags & VIR_DOMAIN_AFFECT_CONFIG)
def = persistentDef;
else
def = vm->def;
- for (i = 0; i < QEMU_NB_NUMA_PARAM && i < *nparams; i++) {
- virMemoryParameterPtr param = ¶ms[i];
+ hasNumatune = virDomainNumatuneGetMode(def->numa, -1, NULL) == 0;
+
+ if ((*nparams) == 0) {
+ *nparams = QEMU_NB_NUMA_PARAM - (hasNumatune ? 0 : 2);
+ ret = 0;
+ goto cleanup;
+ }
+
+ for (i = 0, j = 0; i < QEMU_NB_NUMA_PARAM && j < *nparams; i++) {
+ virMemoryParameterPtr param = ¶ms[j];
switch (i) {
case 0: /* fill numa mode here */
+ if (!hasNumatune)
+ break;
+
if (virTypedParameterAssign(param, VIR_DOMAIN_NUMA_MODE,
VIR_TYPED_PARAM_INT, 0) < 0)
goto cleanup;
virDomainNumatuneGetMode(def->numa, -1,
(virDomainNumatuneMemMode *)
¶m->value.i);
+ j++;
break;
case 1: /* fill numa nodeset here */
+ if (!hasNumatune)
+ break;
+
nodeset = virDomainNumatuneFormatNodeset(def->numa, NULL, -1);
if (!nodeset ||
virTypedParameterAssign(param, VIR_DOMAIN_NUMA_NODESET,
@@ -10584,6 +10594,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
goto cleanup;
nodeset = NULL;
+ j++;
break;
/* coverity[dead_error_begin] */
@@ -10593,8 +10604,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
}
}
- if (*nparams > QEMU_NB_NUMA_PARAM)
- *nparams = QEMU_NB_NUMA_PARAM;
+ *nparams = j;
ret = 0;
cleanup:
--
2.3.6