This patch lifts the limit of calling thread detection code only on KVM
guests. With upstream qemu the thread mappings are reported also on
non-KVM machines.
QEMU adoppted the thread_id information from the kvm branch.
To remain compatible with older upstream versions of qemu the check is
attempted but the failure to detect threads (or even run the monitor
command - on older versions without SMP support) is treated non-fatal
and the code reports one vCPU with pid of the hypervisor (in same
fashion this was done on non-KVM guests).
---
Diff to v1:
- Try to detect vCPU threads on all types of guests but
fall back gracefully if the hypervisor doesn't support it.
---
src/qemu/qemu_process.c | 21 ++++++++-------------
1 files changed, 8 insertions(+), 13 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b7c53ea..d226067 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1613,29 +1613,24 @@ qemuProcessDetectVcpuPIDs(struct qemud_driver *driver,
int ncpupids;
qemuDomainObjPrivatePtr priv = vm->privateData;
- if (vm->def->virtType != VIR_DOMAIN_VIRT_KVM) {
+ qemuDomainObjEnterMonitorWithDriver(driver, vm);
+ /* failure to get the VCPU<-> PID mapping or to execute the query
+ * command will not be treated fatal as some versions of qemu don't
+ * support this command */
+ if ((ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids)) <= 0) {
+ qemuDomainObjExitMonitorWithDriver(driver, vm);
+ virResetLastError();
+
priv->nvcpupids = 1;
if (VIR_ALLOC_N(priv->vcpupids, priv->nvcpupids) < 0) {
virReportOOMError();
return -1;
}
priv->vcpupids[0] = vm->pid;
return 0;
}
-
- /* What follows is now all KVM specific */
-
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- if ((ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids)) < 0) {
- qemuDomainObjExitMonitorWithDriver(driver, vm);
- return -1;
- }
qemuDomainObjExitMonitorWithDriver(driver, vm);
- /* Treat failure to get VCPU<->PID mapping as non-fatal */
- if (ncpupids == 0)
- return 0;
-
if (ncpupids != vm->def->vcpus) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("got wrong number of vCPU pids from QEMU monitor. "
--
1.7.3.4