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

Gui Jianfeng guijianfeng at cn.fujitsu.com
Thu Jun 30 04:41:29 UTC 2011


KAMEZAWA Hiroyuki wrote:
> On Thu, 30 Jun 2011 11:08:32 +0800
> Gui Jianfeng <guijianfeng at cn.fujitsu.com> 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.
>>
> Is that issue able to be fixed by cpuset ?

Yes, I think.

Thanks,
Gui

> 
> Thanks,
> -Kame
> 
>> 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"));
>> +        }
>> +    }
>> +
>>      if (vm->def->blkio.weight != 0) {
>>          if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_BLKIO)) {
>>              rc = virCgroupSetBlkioWeight(cgroup, vm->def->blkio.weight);
>> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
>> index 3d8aba4..8b478c4 100644
>> --- a/src/qemu/qemu_conf.c
>> +++ b/src/qemu/qemu_conf.c
>> @@ -307,7 +307,8 @@ int qemudLoadDriverConfig(struct qemud_driver *driver,
>>              (1 << VIR_CGROUP_CONTROLLER_CPU) |
>>              (1 << VIR_CGROUP_CONTROLLER_DEVICES) |
>>              (1 << VIR_CGROUP_CONTROLLER_MEMORY) |
>> -            (1 << VIR_CGROUP_CONTROLLER_BLKIO);
>> +            (1 << VIR_CGROUP_CONTROLLER_BLKIO) |
>> +            (1 << VIR_CGROUP_CONTROLLER_CPUSET);
>>      }
>>      for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) {
>>          if (driver->cgroupControllers & (1 << i)) {
>> diff --git a/src/util/cgroup.c b/src/util/cgroup.c
>> index 2e5ef46..89b2ad4 100644
>> --- a/src/util/cgroup.c
>> +++ b/src/util/cgroup.c
>> @@ -472,6 +472,24 @@ static int virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
>>      return rc;
>>  }
>>  
>> +int virCgroupCpusetSetcpus(virCgroupPtr group, char *cpustring)
>> +{
>> +    int rc = 0;
>> +    const char *key = "cpuset.cpus";
>> +
>> +    VIR_DEBUG("Cpuset: set %s for %s/%s", cpustring, group->path, key);
>> +
>> +    rc = virCgroupSetValueStr(group,
>> +                              VIR_CGROUP_CONTROLLER_CPUSET,
>> +                              key,
>> +                              cpustring);
>> +
>> +    if (rc != 0)
>> +        VIR_ERROR("Failed to set %s for %s/%s", cpustring, group->path, key);
>> +
>> +    return rc;
>> +}
>> +
>>  static int virCgroupSetMemoryUseHierarchy(virCgroupPtr group)
>>  {
>>      int rc = 0;
>> diff --git a/src/util/cgroup.h b/src/util/cgroup.h
>> index 8ae756d..ca6a68a 100644
>> --- a/src/util/cgroup.h
>> +++ b/src/util/cgroup.h
>> @@ -30,6 +30,8 @@ enum {
>>  
>>  VIR_ENUM_DECL(virCgroupController);
>>  
>> +int virCgroupCpusetSetcpus(virCgroupPtr group, char *cpustring);
>> +
>>  int virCgroupForDriver(const char *name,
>>                         virCgroupPtr *group,
>>                         int privileged,
>> -- 
>> 1.7.1
>>
>>
> 
> 

-- 
Regards
Gui Jianfeng




More information about the libvir-list mailing list