diff --git a/src/Makefile.am b/src/Makefile.am
index 952dfdbb5f..12dd6b80e1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -108,6 +108,7 @@ include locking/Makefile.inc.am
include admin/Makefile.inc.am
include rpc/Makefile.inc.am
include test/Makefile.inc.am
+include hypervisor/Makefile.inc.am
include esx/Makefile.inc.am
include hyperv/Makefile.inc.am
include vmx/Makefile.inc.am
diff --git a/src/hypervisor/Makefile.inc.am b/src/hypervisor/Makefile.inc.am
new file mode 100644
index 0000000000..961b4e2b95
--- /dev/null
+++ b/src/hypervisor/Makefile.inc.am
@@ -0,0 +1,14 @@
+# vim: filetype=automake
+
+HYPERVISOR_SOURCES = \
+ hypervisor/domain_cgroup.h \
+ hypervisor/domain_cgroup.c \
+ $(NULL)
+
+noinst_LTLIBRARIES += libvirt_hypervisor.la
+libvirt_la_BUILT_LIBADD += libvirt_hypervisor.la
+libvirt_hypervisor_la_CFLAGS = \
+ -I$(srcdir)/conf \
+ $(AM_CFLAGS) \
+ $(NULL)
+libvirt_hypervisor_la_SOURCES = $(HYPERVISOR_SOURCES)
diff --git a/src/hypervisor/domain_cgroup.c b/src/hypervisor/domain_cgroup.c
new file mode 100644
index 0000000000..bef60f56c5
--- /dev/null
+++ b/src/hypervisor/domain_cgroup.c
@@ -0,0 +1,67 @@
+/*
+ * domain_cgroup.c: cgroup 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_cgroup.h"
+
+
+int
+virDomainCgroupSetupBlkio(virCgroupPtr cgroup, virDomainBlkiotune blkio)
+{
+ size_t i;
+
+ if (blkio.weight != 0 &&
+ virCgroupSetBlkioWeight(cgroup, blkio.weight) < 0)
+ return -1;
+
+ if (blkio.ndevices) {
+ for (i = 0; i < blkio.ndevices; i++) {
+ virBlkioDevicePtr dev = &blkio.devices[i];
+
+ if (dev->weight &&
+ virCgroupSetupBlkioDeviceWeight(cgroup, dev->path,
+ &dev->weight) < 0)
+ return -1;
+
+ if (dev->riops &&
+ virCgroupSetupBlkioDeviceReadIops(cgroup, dev->path,
+ &dev->riops) < 0)
+ return -1;
+
+ if (dev->wiops &&
+ virCgroupSetupBlkioDeviceWriteIops(cgroup, dev->path,
+ &dev->wiops) < 0)
+ return -1;
+
+ if (dev->rbps &&
+ virCgroupSetupBlkioDeviceReadBps(cgroup, dev->path,
+ &dev->rbps) < 0)
+ return -1;
+
+ if (dev->wbps &&
+ virCgroupSetupBlkioDeviceWriteBps(cgroup, dev->path,
+ &dev->wbps) < 0)
+ return -1;
+ }
+ }
+
+ return 0;
+}
diff --git a/src/hypervisor/domain_cgroup.h b/src/hypervisor/domain_cgroup.h
new file mode 100644
index 0000000000..af244bd2d2
--- /dev/null
+++ b/src/hypervisor/domain_cgroup.h
@@ -0,0 +1,27 @@
+/*
+ * domain_cgroup.h: cgroup 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 "vircgroup.h"
+#include "domain_conf.h"
+
+
+int virDomainCgroupSetupBlkio(virCgroupPtr cgroup, virDomainBlkiotune blkio);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 354fc79c16..283d6ef71f 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1390,6 +1390,10 @@ virSetConnectSecret;
virSetConnectStorage;
+# hypervisor/domain_cgroup.h
+virDomainCgroupSetupBlkio;
+
+
# libvirt_internal.h
virConnectSupportsFeature;
virDomainMigrateBegin3;
diff --git a/src/lxc/Makefile.inc.am b/src/lxc/Makefile.inc.am
index f69c1acff5..2fee607d3d 100644
--- a/src/lxc/Makefile.inc.am
+++ b/src/lxc/Makefile.inc.am
@@ -97,6 +97,7 @@ libvirt_driver_lxc_impl_la_CFLAGS = \
-I$(srcdir)/conf \
-I$(builddir)/lxc \
-I$(builddir)/rpc \
+ -I$(srcdir)/hypervisor \
$(AM_CFLAGS) \
$(NULL)
libvirt_driver_lxc_impl_la_LIBADD = \
@@ -221,6 +222,7 @@ libvirt_lxc_CFLAGS = \
-I$(srcdir)/conf \
-I$(builddir)/lxc \
-I$(builddir)/rpc \
+ -I$(srcdir)/hypervisor \
$(AM_CFLAGS) \
$(PIE_CFLAGS) \
$(CAPNG_CFLAGS) \
diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 3c7e31c36b..96a89256a1 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -23,6 +23,7 @@
#include "lxc_cgroup.h"
#include "lxc_container.h"
+#include "domain_cgroup.h"
#include "virfile.h"
#include "virerror.h"
#include "virlog.h"
@@ -101,44 +102,7 @@ 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 &&
- virCgroupSetupBlkioDeviceWeight(cgroup, dev->path,
- &dev->weight) < 0)
- return -1;
-
- if (dev->riops &&
- virCgroupSetupBlkioDeviceReadIops(cgroup, dev->path,
- &dev->riops) < 0)
- return -1;
-
- if (dev->wiops &&
- virCgroupSetupBlkioDeviceWriteIops(cgroup, dev->path,
- &dev->wiops) < 0)
- return -1;
-
- if (dev->rbps &&
- virCgroupSetupBlkioDeviceReadBps(cgroup, dev->path,
- &dev->rbps) < 0)
- return -1;
-
- if (dev->wbps &&
- virCgroupSetupBlkioDeviceWriteBps(cgroup, dev->path,
- &dev->wbps) < 0)
- return -1;
- }
- }
-
- return 0;
+ return virDomainCgroupSetupBlkio(cgroup, def->blkio);
}
diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am
index b9c0c6ea9c..94a333f855 100644
--- a/src/qemu/Makefile.inc.am
+++ b/src/qemu/Makefile.inc.am
@@ -98,6 +98,7 @@ libvirt_driver_qemu_impl_la_CFLAGS = \
-I$(builddir)/access \
-I$(srcdir)/conf \
-I$(srcdir)/secret \
+ -I$(srcdir)/hypervisor \
$(AM_CFLAGS) \
$(NULL)
libvirt_driver_qemu_impl_la_LDFLAGS = $(AM_LDFLAGS)
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index da96a60a08..475c063823 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -30,6 +30,7 @@
#include "viralloc.h"
#include "virerror.h"
#include "domain_audit.h"
+#include "domain_cgroup.h"
#include "virscsi.h"
#include "virstring.h"
#include "virfile.h"
@@ -591,7 +592,6 @@ static int
qemuSetupBlkioCgroup(virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
- size_t i;
if (!virCgroupHasController(priv->cgroup,
VIR_CGROUP_CONTROLLER_BLKIO)) {
@@ -604,43 +604,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];
- virCgroupPtr cgroup = priv->cgroup;
-
- if (dev->weight &&
- virCgroupSetupBlkioDeviceWeight(cgroup, dev->path,
- &dev->weight) < 0)
- return -1;
-
- if (dev->riops &&
- virCgroupSetupBlkioDeviceReadIops(cgroup, dev->path,
- &dev->riops) < 0)
- return -1;
-
- if (dev->wiops &&
- virCgroupSetupBlkioDeviceWriteIops(cgroup, dev->path,
- &dev->wiops) < 0)
- return -1;
-
- if (dev->rbps &&
- virCgroupSetupBlkioDeviceReadBps(cgroup, dev->path,
- &dev->rbps) < 0)
- return -1;
-
- if (dev->wbps &&
- virCgroupSetupBlkioDeviceWriteBps(cgroup, dev->path,
- &dev->wbps) < 0)
- return -1;
- }
- }
-
- return 0;
+ return virDomainCgroupSetupBlkio(priv->cgroup, vm->def->blkio);
}