On 02/07/2011 11:59 PM, Gui Jianfeng wrote:
Implement blkio tunable XML configuration and parsing.
Reviewed-by: "Nikunj A. Dadhania" <nikunj(a)linux.vnet.ibm.com>
Signed-off-by: Gui Jianfeng <guijianfeng(a)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(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org