[libvirt] [RFC][PATCH 0/2] Fix zero cpu shares handling

Hello, This series tries to fix the behavior of <cputune><shares>0</shares></cputune> (means default shares of 1024) and virsh schedinfo --set cpu_shares=0 (means minimum of 2) If 0 was explicitly specified, treat it as a valid value (which will get converted to 2 by the kernel) Re-read the shares value to reflect the cpu shares in live XML. In v1, I've tried to change the schedinfo behavior instead, but I have not found a way to reset the value to the kernel default (which is currently 1024 - see ROOT_TASK_GROUP_LOAD in kernel/sched/sched.h in Linux source) other than writing it to the cgroup fs. Partially fixes https://bugzilla.redhat.com/show_bug.cgi?id=998431 Ján Tomko (2): Treat zero cpu shares as a valid value Show the real cpu shares value in live xml src/conf/domain_conf.c | 12 +++++++----- src/conf/domain_conf.h | 1 + src/lxc/lxc_cgroup.c | 13 ++++++++++--- src/lxc/lxc_driver.c | 8 +++++++- src/lxc/lxc_native.c | 8 +++++--- src/qemu/qemu_cgroup.c | 12 +++++++++--- src/qemu/qemu_driver.c | 13 +++++++++++-- src/vmx/vmx.c | 1 + 8 files changed, 51 insertions(+), 17 deletions(-) -- 1.8.3.2

Currently, <cputune><shares>0</shares></cputune> is treated as if it were not specified. Treat is as a valid value if it was explicitly specified and write it to the cgroups. --- src/conf/domain_conf.c | 12 +++++++----- src/conf/domain_conf.h | 1 + src/lxc/lxc_cgroup.c | 2 +- src/lxc/lxc_driver.c | 2 ++ src/lxc/lxc_native.c | 8 +++++--- src/qemu/qemu_cgroup.c | 2 +- src/qemu/qemu_driver.c | 6 +++++- src/vmx/vmx.c | 1 + 8 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1d5cc14..b5f4e67 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11460,11 +11460,13 @@ virDomainDefParseXML(xmlDocPtr xml, } /* Extract cpu tunables. */ - if (virXPathULong("string(./cputune/shares[1])", ctxt, - &def->cputune.shares) < -1) { + if ((n = virXPathULong("string(./cputune/shares[1])", ctxt, + &def->cputune.shares)) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune shares value")); goto error; + } else if (n == 0) { + def->cputune.sharesSpecified = true; } if (virXPathULongLong("string(./cputune/period[1])", ctxt, @@ -17134,14 +17136,14 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAsprintf(buf, " current='%u'", def->vcpus); virBufferAsprintf(buf, ">%u</vcpu>\n", def->maxvcpus); - if (def->cputune.shares || + if (def->cputune.sharesSpecified || (def->cputune.nvcpupin && !virDomainIsAllVcpupinInherited(def)) || def->cputune.period || def->cputune.quota || def->cputune.emulatorpin || def->cputune.emulator_period || def->cputune.emulator_quota) virBufferAddLit(buf, " <cputune>\n"); - if (def->cputune.shares) + if (def->cputune.sharesSpecified) virBufferAsprintf(buf, " <shares>%lu</shares>\n", def->cputune.shares); if (def->cputune.period) @@ -17195,7 +17197,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAsprintf(buf, "cpuset='%s'/>\n", cpumask); VIR_FREE(cpumask); } - if (def->cputune.shares || + if (def->cputune.sharesSpecified || (def->cputune.nvcpupin && !virDomainIsAllVcpupinInherited(def)) || def->cputune.period || def->cputune.quota || def->cputune.emulatorpin || diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2467f65..fed1608 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1999,6 +1999,7 @@ struct _virDomainDef { struct { unsigned long shares; + bool sharesSpecified; unsigned long long period; long long quota; unsigned long long emulator_period; diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index 39d955c..876c32e 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -36,7 +36,7 @@ static int virLXCCgroupSetupCpuTune(virDomainDefPtr def, virCgroupPtr cgroup) { int ret = -1; - if (def->cputune.shares != 0 && + if (def->cputune.sharesSpecified && virCgroupSetCpuShares(cgroup, def->cputune.shares) < 0) goto cleanup; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 10e0fbb..26333a7 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1891,10 +1891,12 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; vm->def->cputune.shares = params[i].value.ul; + vm->def->cputune.sharesSpecified = true; } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { vmdef->cputune.shares = params[i].value.ul; + vmdef->cputune.sharesSpecified = true; } } else if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_VCPU_PERIOD)) { if (flags & VIR_DOMAIN_AFFECT_LIVE) { diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 663e29c..fc19378 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -677,9 +677,11 @@ lxcSetCpuTune(virDomainDefPtr def, virConfPtr properties) virConfValuePtr value; if ((value = virConfGetValue(properties, "lxc.cgroup.cpu.shares")) && - value->str && virStrToLong_ul(value->str, NULL, 10, - &def->cputune.shares) < 0) - goto error; + value->str) { + if (virStrToLong_ul(value->str, NULL, 10, &def->cputune.shares) < 0) + goto error; + def->cputune.sharesSpecified = true; + } if ((value = virConfGetValue(properties, "lxc.cgroup.cpu.cfs_quota_us")) && diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index a97f184..57c7302 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -653,7 +653,7 @@ qemuSetupCpuCgroup(virDomainObjPtr vm) } } - if (vm->def->cputune.shares && + if (vm->def->cputune.sharesSpecified && virCgroupSetCpuShares(priv->cgroup, vm->def->cputune.shares) < 0) return -1; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e04a328..3c9ddb6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9007,10 +9007,14 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virCgroupSetCpuShares(priv->cgroup, value_ul) < 0) goto cleanup; vm->def->cputune.shares = value_ul; + vm->def->cputune.sharesSpecified = true; } - if (flags & VIR_DOMAIN_AFFECT_CONFIG) + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { vmdef->cputune.shares = value_ul; + vmdef->cputune.sharesSpecified = true; + } + } else if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_VCPU_PERIOD)) { SCHED_RANGE_CHECK(value_ul, VIR_DOMAIN_SCHEDULER_VCPU_PERIOD, diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 8fb2a93..75dcdc6 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -1504,6 +1504,7 @@ virVMXParseConfig(virVMXContext *ctx, "found '%s'"), sched_cpu_shares); goto cleanup; } + def->cputune.sharesSpecified = true; } /* def:lifecycle */ -- 1.8.3.2

On 03/04/2014 03:30 PM, Martin Kletzander wrote:
On Tue, Mar 04, 2014 at 02:13:14PM +0100, Ján Tomko wrote:
Currently, <cputune><shares>0</shares></cputune> is treated as if it were not specified.
s/were/was/ in this particular case, I guess.
I think this particular case is a perfectly cromulent use of the past subjunctive to express a counterfactual condition.
ACK,
Martin
Thank you for the review, I will take another look at the series before pushing, since this was an RFC. Jan

[To be squashed in the previous commit] I've found two more places where shareSpecified should be checked and added a test. --- src/parallels/parallels_driver.c | 1 + src/vmx/vmx.c | 2 +- .../qemuxml2argv-cputune-zero-shares.args | 5 ++++ .../qemuxml2argv-cputune-zero-shares.xml | 35 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 33260ef..f0c7762 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -2053,6 +2053,7 @@ parallelsApplyChanges(virConnectPtr conn, virDomainObjPtr dom, virDomainDefPtr n } if (old->cputune.shares != new->cputune.shares || + old->cputune.sharesSpecified != new->cputune.sharesSpecified || old->cputune.period != new->cputune.period || old->cputune.quota != new->cputune.quota || old->cputune.nvcpupin != new->cputune.nvcpupin) { diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 75dcdc6..281aae4 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3176,7 +3176,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe } /* def:cputune.shares -> vmx:sched.cpu.shares */ - if (def->cputune.shares > 0) { + if (def->cputune.sharesSpecified) { /* See http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.... */ if (def->cputune.shares == def->vcpus * 500) { virBufferAddLit(&buffer, "sched.cpu.shares = \"low\"\n"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args new file mode 100644 index 0000000..bc6d241 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu \ +-name QEMUGuest1 -S -M pc -m 214 -smp 2 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \ +-hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml new file mode 100644 index 0000000..d597054 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml @@ -0,0 +1,35 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>2</vcpu> + <cputune> + <shares>0</shares> + <period>1000000</period> + <quota>-1</quota> + <vcpupin vcpu='0' cpuset='0'/> + <vcpupin vcpu='1' cpuset='1'/> + <emulatorpin cpuset='1'/> + </cputune> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5d6a64b..bedfbb1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1163,6 +1163,7 @@ mymain(void) DO_TEST("blkiotune", QEMU_CAPS_NAME); DO_TEST("blkiotune-device", QEMU_CAPS_NAME); DO_TEST("cputune", QEMU_CAPS_NAME); + DO_TEST("cputune-zero-shares", QEMU_CAPS_NAME); DO_TEST("numatune-memory", NONE); DO_TEST("numatune-auto-nodeset-invalid", NONE); DO_TEST("numad", NONE); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 8e8fe71..9a16289 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -260,6 +260,7 @@ mymain(void) DO_TEST("blkiotune"); DO_TEST("blkiotune-device"); DO_TEST("cputune"); + DO_TEST("cputune-zero-shares"); DO_TEST("smp"); DO_TEST("lease"); -- 1.8.3.2

On Thu, Mar 06, 2014 at 03:46:42PM +0100, Ján Tomko wrote:
[To be squashed in the previous commit]
I've found two more places where shareSpecified should be checked and added a test.
And you can find another one in qemuBuildCommandLine(), see commit 45ad1adb4a5ae5ce46287c570e87abab6ffe62d6 ;-) Martin
--- src/parallels/parallels_driver.c | 1 + src/vmx/vmx.c | 2 +- .../qemuxml2argv-cputune-zero-shares.args | 5 ++++ .../qemuxml2argv-cputune-zero-shares.xml | 35 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml
diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 33260ef..f0c7762 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -2053,6 +2053,7 @@ parallelsApplyChanges(virConnectPtr conn, virDomainObjPtr dom, virDomainDefPtr n }
if (old->cputune.shares != new->cputune.shares || + old->cputune.sharesSpecified != new->cputune.sharesSpecified || old->cputune.period != new->cputune.period || old->cputune.quota != new->cputune.quota || old->cputune.nvcpupin != new->cputune.nvcpupin) { diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 75dcdc6..281aae4 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3176,7 +3176,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe }
/* def:cputune.shares -> vmx:sched.cpu.shares */ - if (def->cputune.shares > 0) { + if (def->cputune.sharesSpecified) { /* See http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.... */ if (def->cputune.shares == def->vcpus * 500) { virBufferAddLit(&buffer, "sched.cpu.shares = \"low\"\n"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args new file mode 100644 index 0000000..bc6d241 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu \ +-name QEMUGuest1 -S -M pc -m 214 -smp 2 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \ +-hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml new file mode 100644 index 0000000..d597054 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune-zero-shares.xml @@ -0,0 +1,35 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>2</vcpu> + <cputune> + <shares>0</shares> + <period>1000000</period> + <quota>-1</quota> + <vcpupin vcpu='0' cpuset='0'/> + <vcpupin vcpu='1' cpuset='1'/> + <emulatorpin cpuset='1'/> + </cputune> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5d6a64b..bedfbb1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1163,6 +1163,7 @@ mymain(void) DO_TEST("blkiotune", QEMU_CAPS_NAME); DO_TEST("blkiotune-device", QEMU_CAPS_NAME); DO_TEST("cputune", QEMU_CAPS_NAME); + DO_TEST("cputune-zero-shares", QEMU_CAPS_NAME); DO_TEST("numatune-memory", NONE); DO_TEST("numatune-auto-nodeset-invalid", NONE); DO_TEST("numad", NONE); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 8e8fe71..9a16289 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -260,6 +260,7 @@ mymain(void) DO_TEST("blkiotune"); DO_TEST("blkiotune-device"); DO_TEST("cputune"); + DO_TEST("cputune-zero-shares");
DO_TEST("smp"); DO_TEST("lease"); -- 1.8.3.2
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

--- src/lxc/lxc_cgroup.c | 13 ++++++++++--- src/lxc/lxc_driver.c | 6 +++++- src/qemu/qemu_cgroup.c | 12 +++++++++--- src/qemu/qemu_driver.c | 7 ++++++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index 876c32e..5887b24 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -36,9 +36,16 @@ static int virLXCCgroupSetupCpuTune(virDomainDefPtr def, virCgroupPtr cgroup) { int ret = -1; - if (def->cputune.sharesSpecified && - virCgroupSetCpuShares(cgroup, def->cputune.shares) < 0) - goto cleanup; + + if (def->cputune.sharesSpecified) { + unsigned long long val; + if (virCgroupSetCpuShares(cgroup, def->cputune.shares) < 0) + goto cleanup; + + if (virCgroupGetCpuShares(cgroup, &val) < 0) + goto cleanup; + def->cputune.shares = val; + } if (def->cputune.quota != 0 && virCgroupSetCpuCfsQuota(cgroup, def->cputune.quota) < 0) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 26333a7..aafb81a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1887,10 +1887,14 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_CPU_SHARES)) { if (flags & VIR_DOMAIN_AFFECT_LIVE) { + unsigned long long val; if (virCgroupSetCpuShares(priv->cgroup, params[i].value.ul) < 0) goto cleanup; - vm->def->cputune.shares = params[i].value.ul; + if (virCgroupGetCpuShares(priv->cgroup, &val) < 0) + goto cleanup; + + vm->def->cputune.shares = val; vm->def->cputune.sharesSpecified = true; } diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 57c7302..a13f085 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -653,9 +653,15 @@ qemuSetupCpuCgroup(virDomainObjPtr vm) } } - if (vm->def->cputune.sharesSpecified && - virCgroupSetCpuShares(priv->cgroup, vm->def->cputune.shares) < 0) - return -1; + if (vm->def->cputune.sharesSpecified) { + unsigned long long val; + if (virCgroupSetCpuShares(priv->cgroup, vm->def->cputune.shares) < 0) + return -1; + + if (virCgroupGetCpuShares(priv->cgroup, &val) < 0) + return -1; + vm->def->cputune.shares = val; + } return 0; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3c9ddb6..d082a6b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9004,9 +9004,14 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_CPU_SHARES)) { if (flags & VIR_DOMAIN_AFFECT_LIVE) { + unsigned long long val; if (virCgroupSetCpuShares(priv->cgroup, value_ul) < 0) goto cleanup; - vm->def->cputune.shares = value_ul; + + if (virCgroupGetCpuShares(priv->cgroup, &val) < 0) + goto cleanup; + + vm->def->cputune.shares = val; vm->def->cputune.sharesSpecified = true; } -- 1.8.3.2

On Tue, Mar 04, 2014 at 02:13:15PM +0100, Ján Tomko wrote:
--- src/lxc/lxc_cgroup.c | 13 ++++++++++--- src/lxc/lxc_driver.c | 6 +++++- src/qemu/qemu_cgroup.c | 12 +++++++++--- src/qemu/qemu_driver.c | 7 ++++++- 4 files changed, 30 insertions(+), 8 deletions(-)
ACK, Martin
participants (2)
-
Ján Tomko
-
Martin Kletzander