From ac87d3520ad542d558854a72b0ae0a81fddc6747 Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Mon, 17 Feb 2020 16:29:18 -0500 Subject: [PATCH] domain_cgroup.c: add virDomainCgroupSetupDomainBlkioParameters() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the introduction of virDomainDriverMergeBlkioDevice() in a previous patch, it is now clear that lxcDomainSetBlkioParameters() and qemuDomainSetBlkioParameters() uses the same loop to set cgroup blkio parameter of a domain. Avoid the repetition by adding a new helper called virDomainCgroupSetupDomainBlkioParameters(). Signed-off-by: Daniel Henrique Barboza Signed-off-by: Ján Tomko Reviewed-by: Ján Tomko --- po/POTFILES.in | 1 + src/hypervisor/domain_cgroup.c | 101 +++++++++++++++++++++++++++++++++ src/hypervisor/domain_cgroup.h | 4 ++ src/libvirt_private.syms | 1 + src/lxc/lxc_driver.c | 87 +--------------------------- src/qemu/qemu_driver.c | 88 +--------------------------- 6 files changed, 113 insertions(+), 169 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index aa5c1fb6c7..1675c45206 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -78,6 +78,7 @@ @SRCDIR@/src/hyperv/hyperv_driver.c @SRCDIR@/src/hyperv/hyperv_util.c @SRCDIR@/src/hyperv/hyperv_wmi.c +@SRCDIR@/src/hypervisor/domain_cgroup.c @SRCDIR@/src/hypervisor/domain_driver.c @SRCDIR@/src/interface/interface_backend_netcf.c @SRCDIR@/src/interface/interface_backend_udev.c diff --git a/src/hypervisor/domain_cgroup.c b/src/hypervisor/domain_cgroup.c index e60abd536c..32b07be3d6 100644 --- a/src/hypervisor/domain_cgroup.c +++ b/src/hypervisor/domain_cgroup.c @@ -21,6 +21,9 @@ #include #include "domain_cgroup.h" +#include "domain_driver.h" + +#define VIR_FROM_THIS VIR_FROM_DOMAIN int @@ -84,3 +87,101 @@ virDomainCgroupSetupMemtune(virCgroupPtr cgroup, virDomainMemtune mem) return 0; } + + +int +virDomainCgroupSetupDomainBlkioParameters(virCgroupPtr cgroup, + virDomainDefPtr def, + virTypedParameterPtr params, + int nparams) +{ + size_t i; + int ret = 0; + + for (i = 0; i < nparams; i++) { + virTypedParameterPtr param = ¶ms[i]; + + if (STREQ(param->field, VIR_DOMAIN_BLKIO_WEIGHT)) { + if (virCgroupSetBlkioWeight(cgroup, params[i].value.ui) < 0) + ret = -1; + } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { + size_t ndevices; + virBlkioDevicePtr devices = NULL; + size_t j; + + if (virDomainDriverParseBlkioDeviceStr(params[i].value.s, + param->field, + &devices, + &ndevices) < 0) { + ret = -1; + continue; + } + + if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) { + for (j = 0; j < ndevices; j++) { + if (virCgroupSetupBlkioDeviceWeight(cgroup, devices[j].path, + &devices[j].weight) < 0) { + ret = -1; + break; + } + } + } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) { + for (j = 0; j < ndevices; j++) { + if (virCgroupSetupBlkioDeviceReadIops(cgroup, devices[j].path, + &devices[j].riops) < 0) { + ret = -1; + break; + } + } + } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) { + for (j = 0; j < ndevices; j++) { + if (virCgroupSetupBlkioDeviceWriteIops(cgroup, devices[j].path, + &devices[j].wiops) < 0) { + ret = -1; + break; + } + } + } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) { + for (j = 0; j < ndevices; j++) { + if (virCgroupSetupBlkioDeviceReadBps(cgroup, devices[j].path, + &devices[j].rbps) < 0) { + ret = -1; + break; + } + } + } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { + for (j = 0; j < ndevices; j++) { + if (virCgroupSetupBlkioDeviceWriteBps(cgroup, devices[j].path, + &devices[j].wbps) < 0) { + ret = -1; + break; + } + } + } else { + virReportError(VIR_ERR_INVALID_ARG, _("Unknown blkio parameter %s"), + param->field); + ret = -1; + virBlkioDeviceArrayClear(devices, ndevices); + g_free(devices); + + continue; + } + + if (j != ndevices || + virDomainDriverMergeBlkioDevice(&def->blkio.devices, + &def->blkio.ndevices, + devices, ndevices, + param->field) < 0) + ret = -1; + + virBlkioDeviceArrayClear(devices, ndevices); + g_free(devices); + } + } + + return ret; +} diff --git a/src/hypervisor/domain_cgroup.h b/src/hypervisor/domain_cgroup.h index 82ba47e85f..7f3a0d12f9 100644 --- a/src/hypervisor/domain_cgroup.h +++ b/src/hypervisor/domain_cgroup.h @@ -26,3 +26,7 @@ int virDomainCgroupSetupBlkio(virCgroupPtr cgroup, virDomainBlkiotune blkio); int virDomainCgroupSetupMemtune(virCgroupPtr cgroup, virDomainMemtune mem); +int virDomainCgroupSetupDomainBlkioParameters(virCgroupPtr cgroup, + virDomainDefPtr def, + virTypedParameterPtr params, + int nparams); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 95f7702795..ede894963d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1392,6 +1392,7 @@ virSetConnectStorage; # hypervisor/domain_cgroup.h virDomainCgroupSetupBlkio; +virDomainCgroupSetupDomainBlkioParameters; virDomainCgroupSetupMemtune; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 78a0174277..c93dee37f8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -56,6 +56,7 @@ #include "virpidfile.h" #include "virfdstream.h" #include "domain_audit.h" +#include "domain_cgroup.h" #include "domain_driver.h" #include "domain_nwfilter.h" #include "virinitctl.h" @@ -2364,90 +2365,8 @@ lxcDomainSetBlkioParameters(virDomainPtr dom, ret = 0; if (def) { - for (i = 0; i < nparams; i++) { - virTypedParameterPtr param = ¶ms[i]; - - if (STREQ(param->field, VIR_DOMAIN_BLKIO_WEIGHT)) { - if (virCgroupSetBlkioWeight(priv->cgroup, params[i].value.ui) < 0) - ret = -1; - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { - virCgroupPtr cgroup = priv->cgroup; - size_t ndevices; - virBlkioDevicePtr devices = NULL; - size_t j; - - if (virDomainDriverParseBlkioDeviceStr(params[i].value.s, - param->field, - &devices, - &ndevices) < 0) { - ret = -1; - continue; - } - - if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWeight(cgroup, devices[j].path, - &devices[j].weight) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceReadIops(cgroup, devices[j].path, - &devices[j].riops) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWriteIops(cgroup, devices[j].path, - &devices[j].wiops) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceReadBps(cgroup, devices[j].path, - &devices[j].rbps) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWriteBps(cgroup, devices[j].path, - &devices[j].wbps) < 0) { - ret = -1; - break; - } - } - } else { - virReportError(VIR_ERR_INVALID_ARG, _("Unknown blkio parameter %s"), - param->field); - ret = -1; - virBlkioDeviceArrayClear(devices, ndevices); - VIR_FREE(devices); - - continue; - } - - if (j != ndevices || - virDomainDriverMergeBlkioDevice(&def->blkio.devices, - &def->blkio.ndevices, - devices, ndevices, - param->field) < 0) - ret = -1; - virBlkioDeviceArrayClear(devices, ndevices); - VIR_FREE(devices); - } - } + ret = virDomainCgroupSetupDomainBlkioParameters(priv->cgroup, def, + params, nparams); } if (ret < 0) goto endjob; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c1bfe578f1..41e0b4e719 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -65,6 +65,7 @@ #include "viruuid.h" #include "domain_conf.h" #include "domain_audit.h" +#include "domain_cgroup.h" #include "domain_driver.h" #include "node_device_conf.h" #include "virpci.h" @@ -9375,91 +9376,8 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, ret = 0; if (def) { - for (i = 0; i < nparams; i++) { - virTypedParameterPtr param = ¶ms[i]; - - if (STREQ(param->field, VIR_DOMAIN_BLKIO_WEIGHT)) { - if (virCgroupSetBlkioWeight(priv->cgroup, param->value.ui) < 0 || - virCgroupGetBlkioWeight(priv->cgroup, &def->blkio.weight) < 0) - ret = -1; - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS) || - STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { - virCgroupPtr cgroup = priv->cgroup; - size_t ndevices; - virBlkioDevicePtr devices = NULL; - size_t j; - - if (virDomainDriverParseBlkioDeviceStr(param->value.s, - param->field, - &devices, - &ndevices) < 0) { - ret = -1; - continue; - } - - if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWeight(cgroup, devices[j].path, - &devices[j].weight) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceReadIops(cgroup, devices[j].path, - &devices[j].riops) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWriteIops(cgroup, devices[j].path, - &devices[j].wiops) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceReadBps(cgroup, devices[j].path, - &devices[j].rbps) < 0) { - ret = -1; - break; - } - } - } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { - for (j = 0; j < ndevices; j++) { - if (virCgroupSetupBlkioDeviceWriteBps(cgroup, devices[j].path, - &devices[j].wbps) < 0) { - ret = -1; - break; - } - } - } else { - virReportError(VIR_ERR_INVALID_ARG, _("Unknown blkio parameter %s"), - param->field); - ret = -1; - virBlkioDeviceArrayClear(devices, ndevices); - VIR_FREE(devices); - - continue; - } - - if (j != ndevices || - virDomainDriverMergeBlkioDevice(&def->blkio.devices, - &def->blkio.ndevices, - devices, ndevices, - param->field) < 0) - ret = -1; - virBlkioDeviceArrayClear(devices, ndevices); - VIR_FREE(devices); - } - } + ret = virDomainCgroupSetupDomainBlkioParameters(priv->cgroup, def, + params, nparams); if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) goto endjob; -- GitLab