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(a)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