Both qemu and lxc drivers have some duplicate code when
dealing with cgroups, such as virLXCCgroupSetupBlkioTune()
and qemuSetupBlkioCgroup(), duplicate code over 80, so
consolidate the same chunk into a separate routine.
Signed-off-by: Mao Zhongyi <maozhongyi(a)cmss.chinamobile.com>
Signed-off-by: Zhang Shengju <zhangshengju(a)cmss.chinamobile.com>
---
src/libvirt_private.syms | 1 +
src/lxc/lxc_cgroup.c | 56 +-----------------------------------
src/qemu/qemu_cgroup.c | 47 +------------------------------
src/util/vircgroup.c | 61 ++++++++++++++++++++++++++++++++++++++++
src/util/vircgroup.h | 3 ++
5 files changed, 67 insertions(+), 101 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 94509d6f43..3df2af55bd 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1685,6 +1685,7 @@ virCgroupSetMemoryHardLimit;
virCgroupSetMemorySoftLimit;
virCgroupSetMemSwapHardLimit;
virCgroupSetOwner;
+virCgroupSetupBlkio;
virCgroupSupportsCpuBW;
virCgroupTerminateMachine;
diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 0a019dc813..fdf8df79aa 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -102,60 +102,6 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
}
-static int virLXCCgroupSetupBlkioTune(virDomainDefPtr def,
- virCgroupPtr cgroup)
-{
- size_t i;
-
- if (def->blkio.weight &&
- virCgroupSetBlkioWeight(cgroup, def->blkio.weight) < 0)
- return -1;
-
- if (def->blkio.ndevices) {
- for (i = 0; i < def->blkio.ndevices; i++) {
- virBlkioDevicePtr dev = &def->blkio.devices[i];
-
- if (dev->weight &&
- (virCgroupSetBlkioDeviceWeight(cgroup, dev->path,
- dev->weight) < 0 ||
- virCgroupGetBlkioDeviceWeight(cgroup, dev->path,
- &dev->weight) < 0))
- return -1;
-
- if (dev->riops &&
- (virCgroupSetBlkioDeviceReadIops(cgroup, dev->path,
- dev->riops) < 0 ||
- virCgroupGetBlkioDeviceReadIops(cgroup, dev->path,
- &dev->riops) < 0))
- return -1;
-
- if (dev->wiops &&
- (virCgroupSetBlkioDeviceWriteIops(cgroup, dev->path,
- dev->wiops) < 0 ||
- virCgroupGetBlkioDeviceWriteIops(cgroup, dev->path,
- &dev->wiops) < 0))
- return -1;
-
- if (dev->rbps &&
- (virCgroupSetBlkioDeviceReadBps(cgroup, dev->path,
- dev->rbps) < 0 ||
- virCgroupGetBlkioDeviceReadBps(cgroup, dev->path,
- &dev->rbps) < 0))
- return -1;
-
- if (dev->wbps &&
- (virCgroupSetBlkioDeviceWriteBps(cgroup, dev->path,
- dev->wbps) < 0 ||
- virCgroupGetBlkioDeviceWriteBps(cgroup, dev->path,
- &dev->wbps) < 0))
- return -1;
- }
- }
-
- return 0;
-}
-
-
static int virLXCCgroupSetupMemTune(virDomainDefPtr def,
virCgroupPtr cgroup)
{
@@ -489,7 +435,7 @@ int virLXCCgroupSetup(virDomainDefPtr def,
if (virLXCCgroupSetupCpusetTune(def, cgroup, nodemask) < 0)
goto cleanup;
- if (virLXCCgroupSetupBlkioTune(def, cgroup) < 0)
+ if (virCgroupSetupBlkio(cgroup, def) < 0)
goto cleanup;
if (virLXCCgroupSetupMemTune(def, cgroup) < 0)
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 131cdd1134..c9925ee5ca 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -521,7 +521,6 @@ static int
qemuSetupBlkioCgroup(virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
- size_t i;
if (!virCgroupHasController(priv->cgroup,
VIR_CGROUP_CONTROLLER_BLKIO)) {
@@ -534,51 +533,7 @@ qemuSetupBlkioCgroup(virDomainObjPtr vm)
}
}
- if (vm->def->blkio.weight != 0 &&
- virCgroupSetBlkioWeight(priv->cgroup, vm->def->blkio.weight) < 0)
- return -1;
-
- if (vm->def->blkio.ndevices) {
- for (i = 0; i < vm->def->blkio.ndevices; i++) {
- virBlkioDevicePtr dev = &vm->def->blkio.devices[i];
- if (dev->weight &&
- (virCgroupSetBlkioDeviceWeight(priv->cgroup, dev->path,
- dev->weight) < 0 ||
- virCgroupGetBlkioDeviceWeight(priv->cgroup, dev->path,
- &dev->weight) < 0))
- return -1;
-
- if (dev->riops &&
- (virCgroupSetBlkioDeviceReadIops(priv->cgroup, dev->path,
- dev->riops) < 0 ||
- virCgroupGetBlkioDeviceReadIops(priv->cgroup, dev->path,
- &dev->riops) < 0))
- return -1;
-
- if (dev->wiops &&
- (virCgroupSetBlkioDeviceWriteIops(priv->cgroup, dev->path,
- dev->wiops) < 0 ||
- virCgroupGetBlkioDeviceWriteIops(priv->cgroup, dev->path,
- &dev->wiops) < 0))
- return -1;
-
- if (dev->rbps &&
- (virCgroupSetBlkioDeviceReadBps(priv->cgroup, dev->path,
- dev->rbps) < 0 ||
- virCgroupGetBlkioDeviceReadBps(priv->cgroup, dev->path,
- &dev->rbps) < 0))
- return -1;
-
- if (dev->wbps &&
- (virCgroupSetBlkioDeviceWriteBps(priv->cgroup, dev->path,
- dev->wbps) < 0 ||
- virCgroupGetBlkioDeviceWriteBps(priv->cgroup, dev->path,
- &dev->wbps) < 0))
- return -1;
- }
- }
-
- return 0;
+ return virCgroupSetupBlkio(priv->cgroup, vm->def);
}
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index b46f20abfd..165e5f4854 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -1419,6 +1419,67 @@ virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight)
getBlkioWeight, -1, weight);
}
+/**
+ * virCgroupSetupBlkio
+ *
+ * @group: The cgroup to change block io setting for
+ * @def: pointer to domain def
+ *
+ * Returns: 0 on success, -1 on error
+ */
+int
+virCgroupSetupBlkio(virCgroupPtr group, virDomainDefPtr def)
+{
+ size_t i;
+
+ if (def->blkio.weight != 0 &&
+ virCgroupSetBlkioWeight(group, def->blkio.weight) < 0)
+ return -1;
+
+ if (def->blkio.ndevices) {
+ for (i = 0; i < def->blkio.ndevices; i++) {
+ virBlkioDevicePtr dev = &def->blkio.devices[i];
+ if (dev->weight &&
+ (virCgroupSetBlkioDeviceWeight(group, dev->path,
+ dev->weight) < 0 ||
+ virCgroupGetBlkioDeviceWeight(group, dev->path,
+ &dev->weight) < 0))
+ return -1;
+
+ if (dev->riops &&
+ (virCgroupSetBlkioDeviceReadIops(group, dev->path,
+ dev->riops) < 0 ||
+ virCgroupGetBlkioDeviceReadIops(group, dev->path,
+ &dev->riops) < 0))
+ return -1;
+
+ if (dev->wiops &&
+ (virCgroupSetBlkioDeviceWriteIops(group, dev->path,
+ dev->wiops) < 0 ||
+ virCgroupGetBlkioDeviceWriteIops(group, dev->path,
+ &dev->wiops) < 0))
+ return -1;
+
+ if (dev->rbps &&
+ (virCgroupSetBlkioDeviceReadBps(group, dev->path,
+ dev->rbps) < 0 ||
+ virCgroupGetBlkioDeviceReadBps(group, dev->path,
+ &dev->rbps) < 0))
+ return -1;
+
+ if (dev->wbps &&
+ (virCgroupSetBlkioDeviceWriteBps(group, dev->path,
+ dev->wbps) < 0 ||
+ virCgroupGetBlkioDeviceWriteBps(group, dev->path,
+ &dev->wbps) < 0))
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
/**
* virCgroupSetBlkioDeviceReadIops:
* @group: The cgroup to change block io setting for
diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h
index 3eefe78787..9815c51fda 100644
--- a/src/util/vircgroup.h
+++ b/src/util/vircgroup.h
@@ -24,6 +24,7 @@
#include "virutil.h"
#include "virbitmap.h"
#include "virenum.h"
+#include "conf/domain_conf.h"
struct _virCgroup;
typedef struct _virCgroup virCgroup;
@@ -123,6 +124,8 @@ int virCgroupAddThread(virCgroupPtr group, pid_t pid);
int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned int weight);
int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight);
+int virCgroupSetupBlkio(virCgroupPtr group, virDomainDefPtr def);
+
int virCgroupGetBlkioIoServiced(virCgroupPtr group,
long long *bytes_read,
long long *bytes_write,
--
2.17.1