diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 88d2c6ee78..2ca78031cb 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -349,6 +349,7 @@ struct virQEMUCapsMachineType {
char *name;
char *alias;
unsigned int maxCpus;
+ bool hotplugCpus;
};
/*
* Update the XML parser/formatter when adding more
@@ -550,6 +551,7 @@ virQEMUCapsParseMachineTypesStr(const char *output,
}
/* When parsing from command line we don't have information about maxCpus */
qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].maxCpus = 0;
+ qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].hotplugCpus = false;
} while ((p = next));
@@ -2105,6 +2107,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0)
goto error;
ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus;
+ ret->machineTypes[i].hotplugCpus = qemuCaps->machineTypes[i].hotplugCpus;
}
if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps->ngicCapabilities) < 0)
@@ -2414,6 +2417,20 @@ int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
}
+bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps,
+ const char *name)
+{
+ size_t i;
+
+ for (i = 0; i < qemuCaps->nmachineTypes; i++) {
+ if (STREQ_NULLABLE(qemuCaps->machineTypes[i].name, name))
+ return qemuCaps->machineTypes[i].hotplugCpus;
+ }
+
+ return false;
+}
+
+
/**
* virQEMUCapsSetGICCapabilities:
* @qemuCaps: QEMU capabilities
@@ -2572,6 +2589,7 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
goto cleanup;
mach->maxCpus = machines[i]->maxCpus;
+ mach->hotplugCpus = machines[i]->hotplugCpus;
if (machines[i]->isDefault)
defIdx = qemuCaps->nmachineTypes - 1;
@@ -2830,7 +2848,7 @@ int virQEMUCapsProbeQMP(virQEMUCapsPtr qemuCaps,
* ...
*
* ...
- *
+ *
* ...
*
*/
@@ -2991,6 +3009,11 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
goto cleanup;
}
VIR_FREE(str);
+
+ str = virXMLPropString(nodes[i], "hotplugCpus");
+ if (STREQ_NULLABLE(str, "yes"))
+ qemuCaps->machineTypes[i].hotplugCpus = true;
+ VIR_FREE(str);
}
}
VIR_FREE(nodes);
@@ -3124,6 +3147,8 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps,
if (qemuCaps->machineTypes[i].alias)
virBufferEscapeString(&buf, " alias='%s'",
qemuCaps->machineTypes[i].alias);
+ if (qemuCaps->machineTypes[i].hotplugCpus)
+ virBufferAddLit(&buf, " hotplugCpus='yes'");
virBufferAsprintf(&buf, " maxCpus='%u'/>\n",
qemuCaps->machineTypes[i].maxCpus);
}
@@ -3912,6 +3937,8 @@ virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
virQEMUCapsClear(qemuCaps, filter->flags[j]);
}
+ if (!virQEMUCapsGetMachineHotplugCpus(qemuCaps, machineType))
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);
}
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 365394dde0..a74d39f2b9 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -428,6 +428,8 @@ const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
const char *name);
int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
const char *name);
+bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps,
+ const char *name);
int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
size_t *nmachines,
virCapsGuestMachinePtr **machines);
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 826991f36c..417091c50a 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -854,6 +854,7 @@ struct _qemuMonitorMachineInfo {
bool isDefault;
char *alias;
unsigned int maxCpus;
+ bool hotplugCpus;
};
int qemuMonitorGetMachines(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 4f4fb4fac3..ab5423e81c 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -4840,6 +4840,9 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon,
_("query-machines reply has malformed 'cpu-max' data"));
goto cleanup;
}
+
+ ignore_value(virJSONValueObjectGetBoolean(child, "hotpluggable-cpus",
+ &info->hotplugCpus));
}
ret = n;
diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
index daae569b3d..7a5404086b 100644
--- a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
@@ -227,31 +227,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+