[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