[libvirt] [PATCH 3/4 v2] qemu: Implement blkio tunable XML configuration and parsing.

Gui Jianfeng guijianfeng at cn.fujitsu.com
Thu Jan 27 05:19:25 UTC 2011


Implement blkio tunable XML configuration and parsing.

Signed-off-by: Gui Jianfeng <guijianfeng at cn.fujitsu.com>
---
 src/conf/domain_conf.c |   15 ++++++++++++++-
 src/conf/domain_conf.h |    4 ++++
 src/qemu/qemu_cgroup.c |   16 +++++++++++++++-
 src/qemu/qemu_conf.c   |    3 ++-
 4 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 645767e..1d4cd30 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,11 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     if (node)
         def->mem.hugepage_backed = 1;
 
+    /* Extract blkio cgroup tunables */
+    if (virXPathULong("string(./blkiotune/weight)", ctxt,
+                     &def->blkio.weight) < 0)
+        def->blkio.weight = 0;
+
     /* Extract other memory tunables */
     if (virXPathULong("string(./memtune/hard_limit)", ctxt,
                       &def->mem.hard_limit) < 0)
@@ -7289,6 +7294,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..f664c17 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 {
+        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                        _("Block I/O tuning is not available on this host"));
+    }
+
     if ((rc = qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_MEMORY))) {
         if (vm->def->mem.hard_limit != 0) {
             rc = virCgroupSetMemoryHardLimit(cgroup, vm->def->mem.hard_limit);
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index e1502dc..121080f 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -299,7 +299,8 @@ int qemudLoadDriverConfig(struct qemud_driver *driver,
         driver->cgroupControllers =
             (1 << VIR_CGROUP_CONTROLLER_CPU) |
             (1 << VIR_CGROUP_CONTROLLER_DEVICES) |
-            (1 << VIR_CGROUP_CONTROLLER_MEMORY);
+            (1 << VIR_CGROUP_CONTROLLER_MEMORY) |
+            (1 << VIR_CGROUP_CONTROLLER_BLKIO);
     }
     for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) {
         if (driver->cgroupControllers & (1 << i)) {
-- 
1.7.1






More information about the libvir-list mailing list