diff --git a/po/POTFILES.in b/po/POTFILES.in
index dba0d3a12e..aa5c1fb6c7 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_driver.c
@SRCDIR@/src/interface/interface_backend_netcf.c
@SRCDIR@/src/interface/interface_backend_udev.c
@SRCDIR@/src/internal.h
diff --git a/src/hypervisor/Makefile.inc.am b/src/hypervisor/Makefile.inc.am
index 961b4e2b95..02cf2c7cb1 100644
--- a/src/hypervisor/Makefile.inc.am
+++ b/src/hypervisor/Makefile.inc.am
@@ -3,6 +3,8 @@
HYPERVISOR_SOURCES = \
hypervisor/domain_cgroup.h \
hypervisor/domain_cgroup.c \
+ hypervisor/domain_driver.h \
+ hypervisor/domain_driver.c \
$(NULL)
noinst_LTLIBRARIES += libvirt_hypervisor.la
diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
new file mode 100644
index 0000000000..c999458c25
--- /dev/null
+++ b/src/hypervisor/domain_driver.c
@@ -0,0 +1,96 @@
+/*
+ * domain_driver.c: general functions shared between hypervisor drivers
+ *
+ * Copyright IBM Corp. 2020
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ */
+
+#include
+
+#include "domain_driver.h"
+#include "viralloc.h"
+
+#define VIR_FROM_THIS VIR_FROM_DOMAIN
+
+
+/* Modify dest_array to reflect all blkio device changes described in
+ * src_array. */
+int
+virDomainDriverMergeBlkioDevice(virBlkioDevicePtr *dest_array,
+ size_t *dest_size,
+ virBlkioDevicePtr src_array,
+ size_t src_size,
+ const char *type)
+{
+ size_t i, j;
+ virBlkioDevicePtr dest, src;
+
+ for (i = 0; i < src_size; i++) {
+ bool found = false;
+
+ src = &src_array[i];
+ for (j = 0; j < *dest_size; j++) {
+ dest = &(*dest_array)[j];
+ if (STREQ(src->path, dest->path)) {
+ found = true;
+
+ if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
+ dest->weight = src->weight;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
+ dest->riops = src->riops;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
+ dest->wiops = src->wiops;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
+ dest->rbps = src->rbps;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
+ dest->wbps = src->wbps;
+ } else {
+ virReportError(VIR_ERR_INVALID_ARG, _("Unknown parameter %s"),
+ type);
+ return -1;
+ }
+ break;
+ }
+ }
+ if (!found) {
+ if (!src->weight && !src->riops && !src->wiops && !src->rbps && !src->wbps)
+ continue;
+ if (VIR_EXPAND_N(*dest_array, *dest_size, 1) < 0)
+ return -1;
+ dest = &(*dest_array)[*dest_size - 1];
+
+ if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
+ dest->weight = src->weight;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
+ dest->riops = src->riops;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
+ dest->wiops = src->wiops;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
+ dest->rbps = src->rbps;
+ } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
+ dest->wbps = src->wbps;
+ } else {
+ *dest_size = *dest_size - 1;
+ return -1;
+ }
+
+ dest->path = src->path;
+ src->path = NULL;
+ }
+ }
+
+ return 0;
+}
diff --git a/src/hypervisor/domain_driver.h b/src/hypervisor/domain_driver.h
new file mode 100644
index 0000000000..2fb4148dff
--- /dev/null
+++ b/src/hypervisor/domain_driver.h
@@ -0,0 +1,29 @@
+/*
+ * domain_driver.h: general functions shared between hypervisor drivers
+ *
+ * Copyright IBM Corp. 2020
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ */
+
+#pragma once
+
+#include "domain_conf.h"
+
+int virDomainDriverMergeBlkioDevice(virBlkioDevicePtr *dest_array,
+ size_t *dest_size,
+ virBlkioDevicePtr src_array,
+ size_t src_size,
+ const char *type);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f2124731e7..633c62242a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1395,6 +1395,10 @@ virDomainCgroupSetupBlkio;
virDomainCgroupSetupMemtune;
+# hypervisor/domain_cgroup.h
+virDomainDriverMergeBlkioDevice;
+
+
# libvirt_internal.h
virConnectSupportsFeature;
virDomainMigrateBegin3;
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index d6d0f031a5..08c744a69b 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_driver.h"
#include "domain_nwfilter.h"
#include "virinitctl.h"
#include "virnetdev.h"
@@ -2214,75 +2215,6 @@ lxcDomainParseBlkioDeviceStr(char *blkioDeviceStr, const char *type,
return -1;
}
-static int
-lxcDomainMergeBlkioDevice(virBlkioDevicePtr *dest_array,
- size_t *dest_size,
- virBlkioDevicePtr src_array,
- size_t src_size,
- const char *type)
-{
- size_t i, j;
- virBlkioDevicePtr dest, src;
-
- for (i = 0; i < src_size; i++) {
- bool found = false;
-
- src = &src_array[i];
- for (j = 0; j < *dest_size; j++) {
- dest = &(*dest_array)[j];
- if (STREQ(src->path, dest->path)) {
- found = true;
-
- if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
- dest->weight = src->weight;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
- dest->riops = src->riops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
- dest->wiops = src->wiops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
- dest->rbps = src->rbps;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
- dest->wbps = src->wbps;
- } else {
- virReportError(VIR_ERR_INVALID_ARG, _("Unknown parameter %s"),
- type);
- return -1;
- }
-
- break;
- }
- }
- if (!found) {
- if (!src->weight && !src->riops && !src->wiops && !src->rbps && !src->wbps)
- continue;
- if (VIR_EXPAND_N(*dest_array, *dest_size, 1) < 0)
- return -1;
- dest = &(*dest_array)[*dest_size - 1];
-
- if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
- dest->weight = src->weight;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
- dest->riops = src->riops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
- dest->wiops = src->wiops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
- dest->rbps = src->rbps;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
- dest->wbps = src->wbps;
- } else {
- *dest_size = *dest_size - 1;
- return -1;
- }
-
- dest->path = src->path;
- src->path = NULL;
- }
- }
-
- return 0;
-}
-
-
static int
lxcDomainBlockStats(virDomainPtr dom,
const char *path,
@@ -2613,9 +2545,10 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
}
if (j != ndevices ||
- lxcDomainMergeBlkioDevice(&def->blkio.devices,
- &def->blkio.ndevices,
- devices, ndevices, param->field) < 0)
+ virDomainDriverMergeBlkioDevice(&def->blkio.devices,
+ &def->blkio.ndevices,
+ devices, ndevices,
+ param->field) < 0)
ret = -1;
virBlkioDeviceArrayClear(devices, ndevices);
VIR_FREE(devices);
@@ -2645,9 +2578,10 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
ret = -1;
continue;
}
- if (lxcDomainMergeBlkioDevice(&persistentDef->blkio.devices,
- &persistentDef->blkio.ndevices,
- devices, ndevices, param->field) < 0)
+ if (virDomainDriverMergeBlkioDevice(&persistentDef->blkio.devices,
+ &persistentDef->blkio.ndevices,
+ devices, ndevices,
+ param->field) < 0)
ret = -1;
virBlkioDeviceArrayClear(devices, ndevices);
VIR_FREE(devices);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 06cf3e3c94..c552325cd5 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_driver.h"
#include "node_device_conf.h"
#include "virpci.h"
#include "virusb.h"
@@ -9419,74 +9420,6 @@ qemuDomainParseBlkioDeviceStr(char *blkioDeviceStr, const char *type,
return -1;
}
-/* Modify dest_array to reflect all blkio device changes described in
- * src_array. */
-static int
-qemuDomainMergeBlkioDevice(virBlkioDevicePtr *dest_array,
- size_t *dest_size,
- virBlkioDevicePtr src_array,
- size_t src_size,
- const char *type)
-{
- size_t i, j;
- virBlkioDevicePtr dest, src;
-
- for (i = 0; i < src_size; i++) {
- bool found = false;
-
- src = &src_array[i];
- for (j = 0; j < *dest_size; j++) {
- dest = &(*dest_array)[j];
- if (STREQ(src->path, dest->path)) {
- found = true;
-
- if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
- dest->weight = src->weight;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
- dest->riops = src->riops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
- dest->wiops = src->wiops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
- dest->rbps = src->rbps;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
- dest->wbps = src->wbps;
- } else {
- virReportError(VIR_ERR_INVALID_ARG, _("Unknown parameter %s"),
- type);
- return -1;
- }
- break;
- }
- }
- if (!found) {
- if (!src->weight && !src->riops && !src->wiops && !src->rbps && !src->wbps)
- continue;
- if (VIR_EXPAND_N(*dest_array, *dest_size, 1) < 0)
- return -1;
- dest = &(*dest_array)[*dest_size - 1];
-
- if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
- dest->weight = src->weight;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS)) {
- dest->riops = src->riops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS)) {
- dest->wiops = src->wiops;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS)) {
- dest->rbps = src->rbps;
- } else if (STREQ(type, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) {
- dest->wbps = src->wbps;
- } else {
- *dest_size = *dest_size - 1;
- return -1;
- }
-
- dest->path = src->path;
- src->path = NULL;
- }
- }
-
- return 0;
-}
static int
qemuDomainSetBlkioParameters(virDomainPtr dom,
@@ -9628,9 +9561,10 @@ qemuDomainSetBlkioParameters(virDomainPtr dom,
}
if (j != ndevices ||
- qemuDomainMergeBlkioDevice(&def->blkio.devices,
- &def->blkio.ndevices,
- devices, ndevices, param->field) < 0)
+ virDomainDriverMergeBlkioDevice(&def->blkio.devices,
+ &def->blkio.ndevices,
+ devices, ndevices,
+ param->field) < 0)
ret = -1;
virBlkioDeviceArrayClear(devices, ndevices);
VIR_FREE(devices);
@@ -9663,9 +9597,10 @@ qemuDomainSetBlkioParameters(virDomainPtr dom,
ret = -1;
continue;
}
- if (qemuDomainMergeBlkioDevice(&persistentDef->blkio.devices,
- &persistentDef->blkio.ndevices,
- devices, ndevices, param->field) < 0)
+ if (virDomainDriverMergeBlkioDevice(&persistentDef->blkio.devices,
+ &persistentDef->blkio.ndevices,
+ devices, ndevices,
+ param->field) < 0)
ret = -1;
virBlkioDeviceArrayClear(devices, ndevices);
VIR_FREE(devices);