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

Eric Blake eblake at redhat.com
Tue Feb 8 18:12:14 UTC 2011


On 02/07/2011 11:59 PM, Gui Jianfeng wrote:
> Implement blkio tunable XML configuration and parsing.
> 
> Reviewed-by: "Nikunj A. Dadhania" <nikunj at linux.vnet.ibm.com>
> Signed-off-by: Gui Jianfeng <guijianfeng at cn.fujitsu.com>
> ---
>  src/conf/domain_conf.c |   13 +++++++++++++
>  src/conf/domain_conf.h |    4 ++++
>  src/qemu/qemu_cgroup.c |   16 +++++++++++++++-
>  src/qemu/qemu_conf.c   |    3 ++-
>  4 files changed, 34 insertions(+), 2 deletions(-)
> 

> +    /* Extract blkio cgroup tunables */
> +    if (virXPathULong("string(./blkiotune/weight)", ctxt,
> +                     &def->blkio.weight) < 0)
> +        def->blkio.weight = 0;

No range validation here.  But since it fails down the road if it is
outside [100,1000], use of a ULong is overkill (wastes four bytes);
technically, a short would work, but we don't have helper functions for
short, so I'm swapping this to unsigned int.

>  
>      struct {
> +        unsigned long weight;
> +    } blkio;
> +
> +++ b/src/qemu/qemu_cgroup.c
> @@ -54,7 +54,6 @@ int qemuCgroupControllerActive(struct qemud_driver *driver,
>      return 0;
>  }
>  
> -
>  int qemuSetupDiskPathAllow(virDomainDiskDefPtr disk ATTRIBUTE_UNUSED,

Spurious whitespace change.

>                             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 = virCgroupSetBlkioWeight(cgroup, vm->def->blkio.weight);

Oh, if I change types, that means that virCgroupSetBlkioWeight in patch
2/6 needs to handle unsigned int, not unsigned long.

ACK with this squashed in (part of it into patch 2):

diff --git c/src/conf/domain_conf.c w/src/conf/domain_conf.c
index 94369e2..c299c03 100644
--- c/src/conf/domain_conf.c
+++ w/src/conf/domain_conf.c
@@ -5150,7 +5150,7 @@ static virDomainDefPtr
virDomainDefParseXML(virCapsPtr caps,
         def->mem.hugepage_backed = 1;

     /* Extract blkio cgroup tunables */
-    if (virXPathULong("string(./blkiotune/weight)", ctxt,
+    if (virXPathUInt("string(./blkiotune/weight)", ctxt,
                      &def->blkio.weight) < 0)
         def->blkio.weight = 0;

@@ -7690,7 +7690,7 @@ char *virDomainDefFormat(virDomainDefPtr def,
     /* add blkiotune only if there are any */
     if (def->blkio.weight) {
         virBufferVSprintf(&buf, "  <blkiotune>\n");
-        virBufferVSprintf(&buf, "    <weight>%lu</weight>\n",
+        virBufferVSprintf(&buf, "    <weight>%u</weight>\n",
                           def->blkio.weight);
         virBufferVSprintf(&buf, "  </blkiotune>\n");
     }
diff --git c/src/conf/domain_conf.h w/src/conf/domain_conf.h
index 80d58a0..491301f 100644
--- c/src/conf/domain_conf.h
+++ w/src/conf/domain_conf.h
@@ -1029,7 +1029,7 @@ struct _virDomainDef {
     char *description;

     struct {
-        unsigned long weight;
+        unsigned int weight;
     } blkio;

     struct {
diff --git c/src/qemu/qemu_cgroup.c w/src/qemu/qemu_cgroup.c
index 0622c9e..8cd6ce9 100644
--- c/src/qemu/qemu_cgroup.c
+++ w/src/qemu/qemu_cgroup.c
@@ -54,6 +54,7 @@ int qemuCgroupControllerActive(struct qemud_driver
*driver,
     return 0;
 }

+
 int qemuSetupDiskPathAllow(virDomainDiskDefPtr disk ATTRIBUTE_UNUSED,
                            const char *path,
                            size_t depth ATTRIBUTE_UNUSED,
diff --git c/src/util/cgroup.c w/src/util/cgroup.c
index 9cdfc6e..de1fd8e 100644
--- c/src/util/cgroup.c
+++ w/src/util/cgroup.c
@@ -858,7 +858,7 @@ int virCgroupForDomain(virCgroupPtr driver
ATTRIBUTE_UNUSED,
  *
  * Returns: 0 on success
  */
-int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned long weight)
+int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned int weight)
 {
     if (weight > 1000 || weight < 100)
         return -EINVAL;
@@ -877,9 +877,9 @@ int virCgroupSetBlkioWeight(virCgroupPtr group,
unsigned long weight)
  *
  * Returns: 0 on success
  */
-int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned long *weight)
+int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight)
 {
-    long long unsigned int tmp;
+    unsigned long long tmp;
     int ret;
     ret = virCgroupGetValueU64(group,
                                VIR_CGROUP_CONTROLLER_BLKIO,
diff --git c/src/util/cgroup.h w/src/util/cgroup.h
index f1a47dc..f1bdd0f 100644
--- c/src/util/cgroup.h
+++ w/src/util/cgroup.h
@@ -1,6 +1,7 @@
 /*
  * cgroup.h: Interface to tools for managing cgroups
  *
+ * Copyright (C) 2011 Red Hat, Inc.
  * Copyright IBM Corp. 2008
  *
  * See COPYING.LIB for the License of this software
@@ -41,8 +42,8 @@ int virCgroupForDomain(virCgroupPtr driver,

 int virCgroupAddTask(virCgroupPtr group, pid_t pid);

-int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned long weight);
-int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned long *weight);
+int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned int weight);
+int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight);

 int virCgroupSetMemory(virCgroupPtr group, unsigned long long kb);
 int virCgroupGetMemoryUsage(virCgroupPtr group, unsigned long *kb);

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110208/46350cd1/attachment-0001.sig>


More information about the libvir-list mailing list