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@xxxxxxxxxxxxxx> >> --- >> 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list