[libvirt] [PATCH] qemu: fix some api cannot work when disable cpuset in conf

https://bugzilla.redhat.com/show_bug.cgi?id=1244664 If user disable cpuset in qemu.conf, we shouldn't try to use it, also shouldn't make some command which can work without cpuset cannot work. Fix these case: 1. start guest with strict numa policy (we can use libnuma help us). 2. Hot add vcpu. 3. hot add iothread. Signed-off-by: Luyao Huang <lhuang@redhat.com> --- src/qemu/qemu_cgroup.c | 16 ++++++++-------- src/qemu/qemu_driver.c | 10 +++++++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 8ed74ee..640a223 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -1028,10 +1028,6 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm) if (virCgroupAddTask(cgroup_vcpu, priv->vcpupids[i]) < 0) goto cleanup; - if (mem_mask && - virCgroupSetCpusetMems(cgroup_vcpu, mem_mask) < 0) - goto cleanup; - if (period || quota) { if (qemuSetupCgroupVcpuBW(cgroup_vcpu, period, quota) < 0) goto cleanup; @@ -1041,6 +1037,10 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm) if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { virBitmapPtr cpumap = NULL; + if (mem_mask && + virCgroupSetCpusetMems(cgroup_vcpu, mem_mask) < 0) + goto cleanup; + /* try to use the default cpu maps */ if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) cpumap = priv->autoCpuset; @@ -1205,15 +1205,15 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm) goto cleanup; } - if (mem_mask && - virCgroupSetCpusetMems(cgroup_iothread, mem_mask) < 0) - goto cleanup; - /* Set iothreadpin in cgroup if iothreadpin xml is provided */ if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { virBitmapPtr cpumask = NULL; + if (mem_mask && + virCgroupSetCpusetMems(cgroup_iothread, mem_mask) < 0) + goto cleanup; + if (def->iothreadids[i]->cpumask) cpumask = def->iothreadids[i]->cpumask; else if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f352a88..bb7cef4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4597,7 +4597,9 @@ qemuDomainAddCgroupForThread(virCgroupPtr cgroup, if (virCgroupNewThread(cgroup, nameval, idx, true, &new_cgroup) < 0) return NULL; - if (mem_mask && virCgroupSetCpusetMems(new_cgroup, mem_mask) < 0) + if (mem_mask && + virCgroupHasController(cgroup, VIR_CGROUP_CONTROLLER_CPUSET) && + virCgroupSetCpusetMems(new_cgroup, mem_mask) < 0) goto error; /* Add pid/thread to the cgroup */ @@ -4653,7 +4655,8 @@ qemuDomainHotplugPinThread(virBitmapPtr cpumask, { int ret = -1; - if (cgroup) { + if (cgroup && + virCgroupHasController(cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { if (qemuSetupCgroupCpusetCpus(cgroup, cpumask) < 0) { virReportError(VIR_ERR_OPERATION_INVALID, _("failed to set cpuset.cpus in cgroup for id %d"), @@ -4896,7 +4899,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0) goto endjob; - if (def && !(flags & VIR_DOMAIN_VCPU_GUEST) && virNumaIsAvailable()) { + if (def && !(flags & VIR_DOMAIN_VCPU_GUEST) && virNumaIsAvailable() && + virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0, false, &cgroup_temp) < 0) goto endjob; -- 1.8.3.1

On Mon, Jul 20, 2015 at 05:18:37PM +0800, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1244664
If user disable cpuset in qemu.conf, we shouldn't try to use it, also shouldn't make some command which can work without cpuset cannot work.
Fix these case: 1. start guest with strict numa policy (we can use libnuma help us). 2. Hot add vcpu. 3. hot add iothread.
Signed-off-by: Luyao Huang <lhuang@redhat.com> ---
This looks fine, I'll just adjust the commit message before pushing it. ACK after release since we're in rc2 now and nobody really had a problem with this. Martin

On 07/31/2015 08:33 PM, Martin Kletzander wrote:
On Mon, Jul 20, 2015 at 05:18:37PM +0800, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1244664
If user disable cpuset in qemu.conf, we shouldn't try to use it, also shouldn't make some command which can work without cpuset cannot work.
Fix these case: 1. start guest with strict numa policy (we can use libnuma help us). 2. Hot add vcpu. 3. hot add iothread.
Signed-off-by: Luyao Huang <lhuang@redhat.com> ---
This looks fine, I'll just adjust the commit message before pushing it. ACK after release since we're in rc2 now and nobody really had a problem with this.
Yes, this is a corner issue, thanks a lot for your review.
Martin
Luyao
participants (3)
-
lhuang
-
Luyao Huang
-
Martin Kletzander