To allow testing of the cpu updater function, this function needs to be available separately. Export it from qemu_agent.c where it should belong. --- src/qemu/qemu_agent.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_agent.h | 3 +++ src/qemu/qemu_driver.c | 64 +------------------------------------------------- 3 files changed, 67 insertions(+), 63 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 1607e88..fc85e3e 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1597,3 +1597,66 @@ cleanup: virJSONValueFree(cpus); return ret; } + + +/* modify the cpu info structure to set the correct amount of cpus */ +int +qemuAgentUpdateCPUInfo(unsigned int nvcpus, + qemuAgentCPUInfoPtr cpuinfo, + int ncpuinfo) +{ + size_t i; + int nonline = 0; + int nofflinable = 0; + + /* count the active and offlinable cpus */ + for (i = 0; i < ncpuinfo; i++) { + if (cpuinfo[i].online) + nonline++; + + if (cpuinfo[i].offlinable && cpuinfo[i].online) + nofflinable++; + + /* This shouldn't happen, but we can't trust the guest agent */ + if (!cpuinfo[i].online && !cpuinfo[i].offlinable) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid data provided by guest agent")); + return -1; + } + } + + /* the guest agent reported less cpus than requested */ + if (nvcpus > ncpuinfo) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("guest agent reports less cpu than requested")); + return -1; + } + + /* not enough offlinable CPUs to support the request */ + if (nvcpus < nonline - nofflinable) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Cannot offline enough CPUs")); + return -1; + } + + for (i = 0; i < ncpuinfo; i++) { + if (nvcpus < nonline) { + /* unplug */ + if (cpuinfo[i].offlinable && cpuinfo[i].online) { + cpuinfo[i].online = false; + nonline--; + } + } else if (nvcpus > nonline) { + /* plug */ + if (!cpuinfo[i].online) { + cpuinfo[i].online = true; + nonline++; + } + } else { + /* done */ + break; + } + } + + return 0; +} diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index cf70653..5fbacdb 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -94,4 +94,7 @@ struct _qemuAgentCPUInfo { int qemuAgentGetVCPUs(qemuAgentPtr mon, qemuAgentCPUInfoPtr *info); int qemuAgentSetVCPUs(qemuAgentPtr mon, qemuAgentCPUInfoPtr cpus, size_t ncpus); +int qemuAgentUpdateCPUInfo(unsigned int nvcpus, + qemuAgentCPUInfoPtr cpuinfo, + int ncpuinfo); #endif /* __QEMU_AGENT_H__ */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5634abf..2daafa8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4090,68 +4090,6 @@ unsupported: static int -qemuDomainPrepareAgentVCPUs(unsigned int nvcpus, - qemuAgentCPUInfoPtr cpuinfo, - int ncpuinfo) -{ - size_t i; - int nonline = 0; - int nofflinable = 0; - - /* count the active and offlinable cpus */ - for (i = 0; i < ncpuinfo; i++) { - if (cpuinfo[i].online) - nonline++; - - if (cpuinfo[i].offlinable && cpuinfo[i].online) - nofflinable++; - - /* This shouldn't happen, but we can't trust the guest agent */ - if (!cpuinfo[i].online && !cpuinfo[i].offlinable) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Invalid data provided by guest agent")); - return -1; - } - } - - /* the guest agent reported less cpus than requested */ - if (nvcpus > ncpuinfo) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("guest agent reports less cpu than requested")); - return -1; - } - - /* not enough offlinable CPUs to support the request */ - if (nvcpus < nonline - nofflinable) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("Cannot offline enough CPUs")); - return -1; - } - - for (i = 0; i < ncpuinfo; i++) { - if (nvcpus < nonline) { - /* unplug */ - if (cpuinfo[i].offlinable && cpuinfo[i].online) { - cpuinfo[i].online = false; - nonline--; - } - } else if (nvcpus > nonline) { - /* plug */ - if (!cpuinfo[i].online) { - cpuinfo[i].online = true; - nonline++; - } - } else { - /* done */ - break; - } - } - - return 0; -} - - -static int qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, unsigned int flags) { @@ -4243,7 +4181,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, if (ncpuinfo < 0) goto endjob; - if (qemuDomainPrepareAgentVCPUs(nvcpus, cpuinfo, ncpuinfo) < 0) + if (qemuAgentUpdateCPUInfo(nvcpus, cpuinfo, ncpuinfo) < 0) goto endjob; qemuDomainObjEnterAgent(vm); -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list