Allow pinning for inactive cpus. 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
---
src/qemu/qemu_domain.c | 3 ++-
src/qemu/qemu_driver.c | 62 ++++++++++++++++++--------------------------------
2 files changed, 24 insertions(+), 41 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a0dfa7e..f2b9338 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1515,7 +1515,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_CPUPIN
};
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c8b996b..bfabc53 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4754,9 +4754,6 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
goto cleanup;
- virBitmapFree(vcpuinfo->cpumask);
- vcpuinfo->cpumask = NULL;
-
ret = 0;
cleanup:
@@ -5016,36 +5013,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)))
@@ -5068,18 +5048,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;
--
2.6.2