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")); Regards, Daniel -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list