]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: cpu hotplug: Set vcpu state directly in the new structure
authorPeter Krempa <pkrempa@redhat.com>
Thu, 17 Dec 2015 12:19:54 +0000 (13:19 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 3 Feb 2016 12:10:04 +0000 (13:10 +0100)
Avoid using virDomainDefSetVcpus when we can set it directly in the
structure.

src/qemu/qemu_driver.c

index 46138f216eef42e3437355b86d9eb44bbd2cd469..b6133b741e73b1d137488147490ce9e65834ec93 100644 (file)
@@ -4764,6 +4764,7 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
                          unsigned int vcpu)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
+    virDomainVcpuInfoPtr vcpuinfo;
     int ret = -1;
     int rc;
     int oldvcpus = virDomainDefGetVcpus(vm->def);
@@ -4773,6 +4774,15 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
     char *mem_mask = NULL;
     virDomainNumatuneMemMode mem_mode;
 
+    if (!(vcpuinfo = virDomainDefGetVcpu(vm->def, vcpu)))
+        return -1;
+
+    if (vcpuinfo->online) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("vCPU '%u' is already online"), vcpu);
+        return -1;
+    }
+
     qemuDomainObjEnterMonitor(driver, vm);
 
     rc = qemuMonitorSetCPU(priv->mon, vcpu, true);
@@ -4788,7 +4798,7 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
     if (rc < 0)
         goto cleanup;
 
-    ignore_value(virDomainDefSetVcpus(vm->def, oldvcpus + 1));
+    vcpuinfo->online = true;
 
     if (ncpupids < 0)
         goto cleanup;
@@ -4864,12 +4874,22 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
                          unsigned int vcpu)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
+    virDomainVcpuInfoPtr vcpuinfo;
     int ret = -1;
     int rc;
     int oldvcpus = virDomainDefGetVcpus(vm->def);
     pid_t *cpupids = NULL;
     int ncpupids = 0;
 
+    if (!(vcpuinfo = virDomainDefGetVcpu(vm->def, vcpu)))
+        return -1;
+
+    if (!vcpuinfo->online) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("vCPU '%u' is already offline"), vcpu);
+        return -1;
+    }
+
     qemuDomainObjEnterMonitor(driver, vm);
 
     rc = qemuMonitorSetCPU(priv->mon, vcpu, false);
@@ -4893,7 +4913,7 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
         goto cleanup;
     }
 
-    ignore_value(virDomainDefSetVcpus(vm->def, oldvcpus - 1));
+    vcpuinfo->online = false;
 
     if (qemuDomainDelCgroupForThread(priv->cgroup,
                                      VIR_CGROUP_THREAD_VCPU, vcpu) < 0)