[libvirt] [PATCH 3/3] qemu: Implement blkio tunable XML configuration and parsing.
Gui Jianfeng
guijianfeng at cn.fujitsu.com
Thu Jan 27 01:20:23 UTC 2011
Daniel P. Berrange wrote:
> On Sun, Jan 23, 2011 at 02:19:44PM +0800, Gui Jianfeng wrote:
>> Implement blkio tunable XML configuration and parsing.
>>
>> Signed-off-by: Gui Jianfeng <guijianfeng at cn.fujitsu.com>
>> ---
>> src/conf/domain_conf.c | 17 ++++++++++++++++-
>> src/conf/domain_conf.h | 4 ++++
>> src/qemu/qemu_cgroup.c | 16 +++++++++++++++-
>> src/qemu/qemu_conf.c | 3 ++-
>> 4 files changed, 37 insertions(+), 3 deletions(-)
>
> This needs to also update docs/schemas/domain.rng
> and ideally add a new test case + example datafile
> for tests/qemuxml2xmltest.c
>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 645767e..a05ada5 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -4810,7 +4810,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>> {
>> xmlNodePtr *nodes = NULL, node = NULL;
>> char *tmp = NULL;
>> - int i, n;
>> + int i, n, w;
>> long id = -1;
>> virDomainDefPtr def;
>> unsigned long count;
>> @@ -4887,6 +4887,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>> if (node)
>> def->mem.hugepage_backed = 1;
>>
>> + /* Extract blkio cgroup tunables */
>> + w = virXPathULong("string(./blkiotune/weight)", ctxt,
>> + &def->blkio.weight);
>> + if (w < 0 || def->blkio.weight > 1000 || def->blkio.weight < 100)
>> + virDomainReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("I/O weight should fall in [100, 1000]"));
>> +
>
> The virDomainDefParseXML method should only do syntax validation.
> Semantic validation should be left to the hypervisor drivers.
>
>> /* Extract other memory tunables */
>> if (virXPathULong("string(./memtune/hard_limit)", ctxt,
>> &def->mem.hard_limit) < 0)
>> @@ -7289,6 +7296,14 @@ char *virDomainDefFormat(virDomainDefPtr def,
>> virBufferVSprintf(&buf, " <currentMemory>%lu</currentMemory>\n",
>> def->mem.cur_balloon);
>>
>> + /* add blkiotune only if there are any */
>> + if (def->blkio.weight) {
>> + virBufferVSprintf(&buf, " <blkiotune>\n");
>> + virBufferVSprintf(&buf, " <weight>%lu</weight>\n",
>> + def->blkio.weight);
>> + virBufferVSprintf(&buf, " </blkiotune>\n");
>> + }
>> +
>> /* add memtune only if there are any */
>> if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee ||
>> def->mem.swap_hard_limit)
>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>> index cf7bdc0..b117869 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -969,6 +969,10 @@ struct _virDomainDef {
>> char *description;
>>
>> struct {
>> + unsigned long weight;
>> + } blkio;
>> +
>> + struct {
>> unsigned long max_balloon;
>> unsigned long cur_balloon;
>> unsigned long hugepage_backed;
>> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
>> index e5536c0..a3e8e6a 100644
>> --- a/src/qemu/qemu_cgroup.c
>> +++ b/src/qemu/qemu_cgroup.c
>> @@ -54,7 +54,6 @@ int qemuCgroupControllerActive(struct qemud_driver *driver,
>> return 0;
>> }
>>
>> -
>> int qemuSetupDiskPathAllow(virDomainDiskDefPtr disk ATTRIBUTE_UNUSED,
>> const char *path,
>> size_t depth ATTRIBUTE_UNUSED,
>> @@ -270,6 +269,21 @@ int qemuSetupCgroup(struct qemud_driver *driver,
>> }
>> }
>>
>> + if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_BLKIO)) {
>> + if (vm->def->blkio.weight != 0) {
>> + rc = virCgroupSetWeight(cgroup, vm->def->blkio.weight);
>> + if(rc != 0) {
>> + virReportSystemError(-rc,
>> + _("Unable to set io weight for domain %s"),
>> + vm->def->name);
>> + goto cleanup;
>> + }
>> + }
>> + } else {
>> + VIR_WARN("Blkio cgroup is disabled in qemu configuration file: %s",
>> + vm->def->name);
>> + }
>
> I think it is probably worth raising a real error here
>
> qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("Block I/O tuning is not available on this host"));
Ok, Will change.
Thanks,
Gui
>
> Regards,
> Daniel
>
--
Regards
Gui Jianfeng
More information about the libvir-list
mailing list