mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
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
This commit is contained in:
parent
acf521e121
commit
02ae21deb3
@ -1620,7 +1620,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
|
|||||||
virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = {
|
virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = {
|
||||||
.devicesPostParseCallback = qemuDomainDeviceDefPostParse,
|
.devicesPostParseCallback = qemuDomainDeviceDefPostParse,
|
||||||
.domainPostParseCallback = qemuDomainDefPostParse,
|
.domainPostParseCallback = qemuDomainDefPostParse,
|
||||||
.features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG,
|
.features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG |
|
||||||
|
VIR_DOMAIN_DEF_FEATURE_OFFLINE_VCPUPIN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -4760,9 +4760,6 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
|
|||||||
VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
|
VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virBitmapFree(vcpuinfo->cpumask);
|
|
||||||
vcpuinfo->cpumask = NULL;
|
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
@ -5022,36 +5019,19 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
|
|||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if (def) {
|
if (def && !(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) {
|
||||||
if (!(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) {
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
virReportError(VIR_ERR_INVALID_ARG,
|
_("vcpu %d is out of range of live cpu count %d"),
|
||||||
_("vcpu %d is out of range of live cpu count %d"),
|
vcpu, virDomainDefGetVcpus(def));
|
||||||
vcpu, virDomainDefGetVcpus(def));
|
goto endjob;
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vcpuinfolive->online) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
_("setting cpu pinning for inactive vcpu '%d' is not "
|
|
||||||
"supported"), vcpu);
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (persistentDef) {
|
if (persistentDef &&
|
||||||
if (!(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
|
!(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
|
||||||
virReportError(VIR_ERR_INVALID_ARG,
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
_("vcpu %d is out of range of persistent cpu count %d"),
|
_("vcpu %d is out of range of persistent cpu count %d"),
|
||||||
vcpu, virDomainDefGetVcpus(persistentDef));
|
vcpu, virDomainDefGetVcpus(persistentDef));
|
||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
|
||||||
|
|
||||||
if (!vcpuinfopersist->online) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
_("setting cpu pinning for inactive vcpu '%d' is not "
|
|
||||||
"supported"), vcpu);
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(pcpumap = virBitmapNewData(cpumap, maplen)))
|
if (!(pcpumap = virBitmapNewData(cpumap, maplen)))
|
||||||
@ -5074,18 +5054,20 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Configure the corresponding cpuset cgroup before set affinity. */
|
if (vcpuinfolive->online) {
|
||||||
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
|
/* Configure the corresponding cpuset cgroup before set affinity. */
|
||||||
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu,
|
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
|
||||||
false, &cgroup_vcpu) < 0)
|
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu,
|
||||||
goto endjob;
|
false, &cgroup_vcpu) < 0)
|
||||||
if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, pcpumap) < 0)
|
goto endjob;
|
||||||
|
if (qemuSetupCgroupCpusetCpus(cgroup_vcpu, pcpumap) < 0)
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, vcpu), pcpumap) < 0)
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
virBitmapFree(vcpuinfolive->cpumask);
|
virBitmapFree(vcpuinfolive->cpumask);
|
||||||
vcpuinfolive->cpumask = pcpumaplive;
|
vcpuinfolive->cpumask = pcpumaplive;
|
||||||
pcpumaplive = NULL;
|
pcpumaplive = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user