[libvirt] [PATCH 1/2] cpuset: Add cpuset cgroup support.

Gui Jianfeng guijianfeng at cn.fujitsu.com
Sat Jul 2 00:43:14 UTC 2011


On 2011-6-30 17:34, Daniel P. Berrange wrote:
> On Thu, Jun 30, 2011 at 11:08:32AM +0800, Gui Jianfeng wrote:
>> Currently, libvirt makes use of sched_setaffinity() to set Guest processes's
>> cpu affinity. But, sometimes, for instance, when QEmu uses vhost-net, the
>> kernel part of vhost will create a kernel thread for some purpose. In this
>> case, such kernel thread won't inherit QEmu's cpu affinity.
>>
>> This patch enables cpuset cgroup in libvirt and setting cpu affinity by
>> configuring cpuset cgroup.
>>
>> Signed-off-by: Gui Jianfeng<guijianfeng at cn.fujitsu.com>
>> ---
>>   src/libvirt_private.syms |    1 +
>>   src/qemu/qemu_cgroup.c   |   22 ++++++++++++++++++++++
>>   src/qemu/qemu_conf.c     |    3 ++-
>>   src/util/cgroup.c        |   18 ++++++++++++++++++
>>   src/util/cgroup.h        |    2 ++
>>   5 files changed, 45 insertions(+), 1 deletions(-)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 626ac6c..e7aebc7 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -83,6 +83,7 @@ virCgroupMounted;
>>   virCgroupPathOfController;
>>   virCgroupRemove;
>>   virCgroupSetBlkioWeight;
>> +virCgroupCpusetSetcpus;
>>   virCgroupSetCpuShares;
>>   virCgroupSetFreezerState;
>>   virCgroupSetMemory;
>> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
>> index 1298924..eb92409 100644
>> --- a/src/qemu/qemu_cgroup.c
>> +++ b/src/qemu/qemu_cgroup.c
>> @@ -296,6 +296,28 @@ int qemuSetupCgroup(struct qemud_driver *driver,
>>           }
>>       }
>>
>> +    if (vm->def->cpumask != NULL) {
>> +        if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET)) {
>> +            char *cpumask = NULL;
>> +            if ((cpumask =
>> +                 virDomainCpuSetFormat(vm->def->cpumask, vm->def->cpumasklen)) == NULL)
>> +                goto cleanup;
>> +
>> +            rc = virCgroupCpusetSetcpus(cgroup, cpumask);
>> +            if(rc != 0) {
>> +                virReportSystemError(-rc,
>> +                                     _("Unable to set cpus for domain %s"),
>> +                                     vm->def->name);
>> +                VIR_FREE(cpumask);
>> +                goto cleanup;
>> +            }
>> +            VIR_FREE(cpumask);
>> +        } else {
>> +            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                            _("Cpuset is not available on this host"));
> This is an effective regression for any existing deployments which
> are not using cgroups, or do not have the cpuset controller mounted.
>
> IMHO, this 'else' clause should just be removed, to allow the existing
> cpu affinity code to run normally.

Hmm... Yes I think so.
Will update.

Gui

>
> Daniel





More information about the libvir-list mailing list