From: Peter Krempa Date: Fri, 12 Feb 2016 13:57:45 +0000 (+0100) Subject: qemu: add support for offline vcpupin X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=02ae21d;p=libvirt.git qemu: add support for offline vcpupin Allow pinning for inactive vcpus. The pinning mask will be automatically applied as we would apply the default mask in case of a cpu hotplug. Setting the scheduler settings for a vcpu has the same semantics. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1306556 --- diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4fcb85cb59..e859d8ff93 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1620,7 +1620,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = { .devicesPostParseCallback = qemuDomainDeviceDefPostParse, .domainPostParseCallback = qemuDomainDefPostParse, - .features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG, + .features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG | + VIR_DOMAIN_DEF_FEATURE_OFFLINE_VCPUPIN }; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3b02cdbe17..72ed3c096d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4760,9 +4760,6 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver, VIR_CGROUP_THREAD_VCPU, vcpu) < 0) goto cleanup; - virBitmapFree(vcpuinfo->cpumask); - vcpuinfo->cpumask = NULL; - ret = 0; cleanup: @@ -5022,36 +5019,19 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, priv = vm->privateData; - if (def) { - if (!(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) { - virReportError(VIR_ERR_INVALID_ARG, - _("vcpu %d is out of range of live cpu count %d"), - vcpu, virDomainDefGetVcpus(def)); - goto endjob; - } - - if (!vcpuinfolive->online) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("setting cpu pinning for inactive vcpu '%d' is not " - "supported"), vcpu); - goto endjob; - } + if (def && !(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) { + virReportError(VIR_ERR_INVALID_ARG, + _("vcpu %d is out of range of live cpu count %d"), + vcpu, virDomainDefGetVcpus(def)); + goto endjob; } - if (persistentDef) { - if (!(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) { - virReportError(VIR_ERR_INVALID_ARG, - _("vcpu %d is out of range of persistent cpu count %d"), - vcpu, virDomainDefGetVcpus(persistentDef)); - goto endjob; - } - - if (!vcpuinfopersist->online) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("setting cpu pinning for inactive vcpu '%d' is not " - "supported"), vcpu); - goto endjob; - } + if (persistentDef && + !(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) { + virReportError(VIR_ERR_INVALID_ARG, + _("vcpu %d is out of range of persistent cpu count %d"), + vcpu, virDomainDefGetVcpus(persistentDef)); + goto endjob; } if (!(pcpumap = virBitmapNewData(cpumap, maplen))) @@ -5074,18 +5054,20 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, goto endjob; } - /* Configure the corresponding cpuset cgroup before set affinity. */ - if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { - if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu, - false, &cgroup_vcpu) < 0) - goto endjob; - if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, pcpumap) < 0) + if (vcpuinfolive->online) { + /* Configure the corresponding cpuset cgroup before set affinity. */ + if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { + if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu, + false, &cgroup_vcpu) < 0) + goto endjob; + if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, pcpumap) < 0) + goto endjob; + } + + if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0) goto endjob; } - if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0) - goto endjob; - virBitmapFree(vcpuinfolive->cpumask); vcpuinfolive->cpumask = pcpumaplive; pcpumaplive = NULL;