[PATCH 1/1] NEWS.rst: document the 'auto-fill' feature
by Daniel Henrique Barboza
Although this can be considered a new feature, from the user
standpoint is more of a QoL improvement.
Suggested-by: Michal Privoznik <mprivozn(a)redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413(a)gmail.com>
---
NEWS.rst | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst
index a16903c7c3..20964b94d7 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -50,6 +50,14 @@ v6.4.0 (2020-06-02)
allowed only when the format is 'raw' and no other block layer features are
requested.
+ * qemu: auto-fill of incomplete NUMA topologies
+
+ Domains with incomplete NUMA topologies, where the sum of vCPUs in all NUMA
+ cells is less than the total of vCPUs, will get their first NUMA cell to
+ be auto-filled with the remaining vCPUs. This behavior reproduces what QEMU
+ already does in these cases. Users are encouraged to provide complete NUMA
+ topologies to avoid unexpected changes in the domain XML.
+
* **Bug fixes**
* qemu: fixed regression in network device hotplug with new qemu versions
--
2.26.2
4 years, 6 months
[PATCH v2 0/4] NUMA CPUs 'auto-fill' for incomplete topologies
by Daniel Henrique Barboza
changes in v2:
- removed patch 5/5
Gitlab link: https://gitlab.com/danielhb/libvirt/-/tree/vcpus_numa_v2
v1 link: https://www.redhat.com/archives/libvir-list/2020-June/msg00016.html
Daniel Henrique Barboza (4):
numa_conf.c: add helper functions for cpumap operations
qemu_domain.c: NUMA CPUs auto-fill for incomplete topologies
qemuxml2xmltest.c: add NUMA vcpus auto fill tests
formatdomain.html.in: document the NUMA cpus auto fill feature
docs/formatdomain.html.in | 11 ++++-
src/conf/numa_conf.c | 46 ++++++++++++++++++
src/conf/numa_conf.h | 3 ++
src/libvirt_private.syms | 1 +
src/qemu/qemu_domain.c | 47 +++++++++++++++++++
src/qemu/qemu_domain.h | 4 ++
src/qemu/qemu_driver.c | 9 ++++
.../numavcpus-topology-mismatch.xml | 37 +++++++++++++++
...avcpus-topology-mismatch.x86_64-latest.xml | 38 +++++++++++++++
tests/qemuxml2xmltest.c | 1 +
10 files changed, 196 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/numavcpus-topology-mismatch.xml
create mode 100644 tests/qemuxml2xmloutdata/numavcpus-topology-mismatch.x86_64-latest.xml
--
2.26.2
4 years, 6 months
[PATCH 0/6] Restore seclabels on the correct path on 'virsh restore'
by Michal Privoznik
When restoring a domain from a block device a harmless error is
reported. See 6/6 for explanation. But anyway, still worth fixing.
Michal Prívozník (6):
qemu: Use qemuSecurityDomainSetPathLabel() to set seclabes on not
saved state files
qemu: Drop unused qemuSecuritySetSavedStateLabel()
security: Drop unused virSecurityManagerSetSavedStateLabel()
security: Rename virSecurityManagerRestoreSavedStateLabel()
qemu: Rename qemuSecurityRestoreSavedStateLabel()
qemuSecurityDomainRestorePathLabel: Introduce @ignoreNS argument
src/libvirt_private.syms | 3 +-
src/qemu/qemu_driver.c | 6 +--
src/qemu/qemu_security.c | 43 ++++---------------
src/qemu/qemu_security.h | 9 ++--
src/security/security_apparmor.c | 18 ++------
src/security/security_dac.c | 46 +++++---------------
src/security/security_driver.h | 13 ++----
src/security/security_manager.c | 63 +++++++++++++---------------
src/security/security_manager.h | 11 +++--
src/security/security_nop.c | 19 ---------
src/security/security_selinux.c | 49 +++++++---------------
src/security/security_stack.c | 72 +++++++++-----------------------
12 files changed, 101 insertions(+), 251 deletions(-)
--
2.26.2
4 years, 6 months
[PATCH] qemu: do not add model when actual iface type is hostdev
by Paulo de Rezende Pinatti
No default model should be added to the interface
entry at post parse when its actual network type is hostdev
as doing so might cause a mismatch between the interface
definition and its actual device type.
---
src/qemu/qemu_domain.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2dad823a86..33ce0ad992 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5831,6 +5831,7 @@ qemuDomainDeviceNetDefPostParse(virDomainNetDefPtr net,
virQEMUCapsPtr qemuCaps)
{
if (net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
+ virDomainNetResolveActualType(net) != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
!virDomainNetGetModelString(net))
net->model = qemuDomainDefaultNetModel(def, qemuCaps);
--
2.26.2
4 years, 6 months
[PATCHv2] network: Fix a race condition when shutdown & start vm at the same time
by Bingsong Si
When shutdown vm, the qemuProcessStop cleanup virtual interface in two steps:
1. qemuProcessKill kill qemu process, and vif disappeared
2. ovs-vsctl del-port from the ovs bridge
If start a vm in the middle of the two steps, the new vm will reused the vif,
but removed from ovs bridge by step 2
https://www.redhat.com/archives/libvir-list/2020-June/msg00681.html
Signed-off-by: Bingsong Si <owen.si(a)ucloud.cn>
---
src/libvirt_private.syms | 1 +
src/qemu/qemu_process.c | 9 ++++++---
src/util/virnetdevtap.c | 12 ++++++++++--
src/util/virnetdevtap.h | 2 ++
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fc7406f2b7..5258c07368 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2655,6 +2655,7 @@ virNetDevTapDelete;
virNetDevTapGetName;
virNetDevTapGetRealDeviceName;
virNetDevTapInterfaceStats;
+virNetDevTapMutex;
virNetDevTapReattachBridge;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index d36088ba98..2493b092b1 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7483,9 +7483,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
ignore_value(virNetDevMidonetUnbindPort(vport));
} else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
- ignore_value(virNetDevOpenvswitchRemovePort(
- virDomainNetGetActualBridgeName(net),
- net->ifname));
+ virMutexLock(&virNetDevTapMutex);
+ if (!virNetDevExists(net->ifname))
+ ignore_value(virNetDevOpenvswitchRemovePort(
+ virDomainNetGetActualBridgeName(net),
+ net->ifname));
+ virMutexUnlock(&virNetDevTapMutex);
}
}
diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
index 7bd30ea0f9..d685e30a50 100644
--- a/src/util/virnetdevtap.c
+++ b/src/util/virnetdevtap.c
@@ -54,6 +54,8 @@
VIR_LOG_INIT("util.netdevtap");
+virMutex virNetDevTapMutex = VIR_MUTEX_INITIALIZER;
+
/**
* virNetDevTapGetName:
* @tapfd: a tun/tap file descriptor
@@ -238,6 +240,7 @@ int virNetDevTapCreate(char **ifname,
if (!tunpath)
tunpath = "/dev/net/tun";
+ virMutexLock(&virNetDevTapMutex);
memset(&ifr, 0, sizeof(ifr));
for (i = 0; i < tapfdSize; i++) {
if ((fd = open(tunpath, O_RDWR)) < 0) {
@@ -302,6 +305,7 @@ int virNetDevTapCreate(char **ifname,
ret = 0;
cleanup:
+ virMutexUnlock(&virNetDevTapMutex);
if (ret < 0) {
VIR_FORCE_CLOSE(fd);
while (i--)
@@ -369,6 +373,7 @@ int virNetDevTapCreate(char **ifname,
int ret = -1;
char *newifname = NULL;
+ virMutexLock(&virNetDevTapMutex);
if (tapfdSize > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Multiqueue devices are not supported on this system"));
@@ -379,8 +384,10 @@ int virNetDevTapCreate(char **ifname,
* we have to create 'tap' interface first and
* then rename it to 'vnet'
*/
- if ((s = virNetDevSetupControl("tap", &ifr)) < 0)
+ if ((s = virNetDevSetupControl("tap", &ifr)) < 0) {
+ virMutexUnlock(&virNetDevTapMutex);
return -1;
+ }
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0) {
virReportSystemError(errno, "%s",
@@ -434,6 +441,7 @@ int virNetDevTapCreate(char **ifname,
ret = 0;
cleanup:
+ virMutexUnlock(&virNetDevTapMutex);
VIR_FORCE_CLOSE(s);
return ret;
@@ -710,7 +718,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
if (virNetDevSetMAC(*ifname, &tapmac) < 0)
goto error;
- if (virNetDevTapAttachBridge(*ifname, brname, macaddr, vmuuid,
+ if (virNetDevTapReattachBridge(*ifname, brname, macaddr, vmuuid,
virtPortProfile, virtVlan,
isolatedPort, mtu, actualMTU) < 0) {
goto error;
diff --git a/src/util/virnetdevtap.h b/src/util/virnetdevtap.h
index c6bd9285ba..f2d332e5aa 100644
--- a/src/util/virnetdevtap.h
+++ b/src/util/virnetdevtap.h
@@ -29,6 +29,8 @@
# define VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP 1
#endif
+extern virMutex virNetDevTapMutex;
+
int virNetDevTapCreate(char **ifname,
const char *tunpath,
int *tapfd,
--
2.18.4
4 years, 6 months
[libvirt-glib PATCH v2] gitlab: introduce CI jobs testing git master & distro libvirt
by Daniel P. Berrangé
The glib build needs to validate two axis
- A variety of libvirt versions
- Native and mingw
We test a variety of libvirt versions by running a build against the
distro provided libvirt packages. All that is then missing is a build
against the latest libvirt git master, which only needs to be run on
a single distro, for which CentOS 8 is picked as a stable long life
base.
For mingw, we only test against libvirt git master, using Fedora
rawhide. It is expected that any issues against older libvirt will
have already been caught by the native builds.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
.gitlab-ci.yml | 244 ++++++++++++++++++
ci/containers/README.rst | 14 +
ci/containers/libvirt-centos-7.Dockerfile | 88 +++++++
ci/containers/libvirt-centos-8.Dockerfile | 64 +++++
.../libvirt-centos-stream.Dockerfile | 58 +++++
ci/containers/libvirt-debian-10.Dockerfile | 58 +++++
ci/containers/libvirt-debian-9.Dockerfile | 61 +++++
ci/containers/libvirt-debian-sid.Dockerfile | 58 +++++
ci/containers/libvirt-fedora-31.Dockerfile | 55 ++++
ci/containers/libvirt-fedora-32.Dockerfile | 55 ++++
...rt-fedora-rawhide-cross-mingw32.Dockerfile | 133 ++++++++++
...rt-fedora-rawhide-cross-mingw64.Dockerfile | 133 ++++++++++
.../libvirt-fedora-rawhide.Dockerfile | 56 ++++
ci/containers/libvirt-opensuse-151.Dockerfile | 57 ++++
ci/containers/libvirt-ubuntu-1804.Dockerfile | 61 +++++
ci/containers/libvirt-ubuntu-2004.Dockerfile | 58 +++++
ci/containers/refresh | 36 +++
17 files changed, 1289 insertions(+)
create mode 100644 ci/containers/README.rst
create mode 100644 ci/containers/libvirt-centos-7.Dockerfile
create mode 100644 ci/containers/libvirt-centos-8.Dockerfile
create mode 100644 ci/containers/libvirt-centos-stream.Dockerfile
create mode 100644 ci/containers/libvirt-debian-10.Dockerfile
create mode 100644 ci/containers/libvirt-debian-9.Dockerfile
create mode 100644 ci/containers/libvirt-debian-sid.Dockerfile
create mode 100644 ci/containers/libvirt-fedora-31.Dockerfile
create mode 100644 ci/containers/libvirt-fedora-32.Dockerfile
create mode 100644 ci/containers/libvirt-fedora-rawhide-cross-mingw32.Dockerfile
create mode 100644 ci/containers/libvirt-fedora-rawhide-cross-mingw64.Dockerfile
create mode 100644 ci/containers/libvirt-fedora-rawhide.Dockerfile
create mode 100644 ci/containers/libvirt-opensuse-151.Dockerfile
create mode 100644 ci/containers/libvirt-ubuntu-1804.Dockerfile
create mode 100644 ci/containers/libvirt-ubuntu-2004.Dockerfile
create mode 100755 ci/containers/refresh
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 50dae92..8f662b1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,103 @@
stages:
- prebuild
+ - containers
+ - builds
+
+.container_job_template: &container_job_definition
+ image: docker:stable
+ stage: containers
+ services:
+ - docker:dind
+ before_script:
+ - export TAG="$CI_REGISTRY_IMAGE/ci-$NAME:latest"
+ - export COMMON_TAG="$CI_REGISTRY/libvirt/libvirt-glib/ci-$NAME:latest"
+ - docker info
+ - docker login registry.gitlab.com -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
+ script:
+ - docker pull "$TAG" || docker pull "$COMMON_TAG" || true
+ - docker build --cache-from "$TAG" --cache-from "$COMMON_TAG" --tag "$TAG" -f "ci/containers/libvirt-$NAME.Dockerfile" ci
+ - docker push "$TAG"
+ after_script:
+ - docker logout
+
+.script_variables: &script_variables |
+ export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"
+ export SCRATCH_DIR="/tmp/scratch"
+ export VROOT="$SCRATCH_DIR/vroot"
+ export CCACHE_DIR="$PWD/ccache"
+ export CCACHE_MAXSIZE="500M"
+ export PATH="$CCACHE_WRAPPERSDIR:$VROOT/bin:$PATH"
+ export PKG_CONFIG_PATH="$VROOT/lib/pkgconfig"
+ export LD_LIBRARY_PATH="$VROOT/lib"
+
+.git_native_build_job_template: &git_native_build_job_definition
+ image: $CI_REGISTRY_IMAGE/ci-$NAME:latest
+ stage: builds
+ cache:
+ paths:
+ - ccache/
+ key: "$CI_JOB_NAME"
+ before_script:
+ - *script_variables
+ script:
+ - pushd "$PWD"
+ - mkdir -p "$SCRATCH_DIR"
+ - cd "$SCRATCH_DIR"
+ - git clone --depth 1 https://gitlab.com/libvirt/libvirt.git
+ - mkdir libvirt/build
+ - cd libvirt/build
+ - ../autogen.sh --prefix="$VROOT" --without-libvirtd
+ - $MAKE install
+ - popd
+ - mkdir build
+ - cd build
+ - ../autogen.sh --prefix="$VROOT"
+ - $MAKE install
+ - $MAKE dist
+ - if test -x /usr/bin/rpmbuild && test "$RPM" != "skip" ; then rpmbuild --nodeps -ta libvirt-glib*.tar.gz ; fi
+
+.dist_native_build_job_template: &dist_native_build_job_definition
+ image: $CI_REGISTRY_IMAGE/ci-$NAME:latest
+ stage: builds
+ cache:
+ paths:
+ - ccache/
+ key: "$CI_JOB_NAME"
+ before_script:
+ - *script_variables
+ script:
+ - mkdir build
+ - cd build
+ - ../autogen.sh --prefix="$VROOT"
+ - $MAKE install
+ - $MAKE dist
+ - if test -x /usr/bin/rpmbuild && test "$RPM" != "skip" ; then rpmbuild -ta libvirt-glib*.tar.gz ; fi
+
+# Default cross build jobs that are always run
+.git_cross_build_default_job_template: &git_cross_build_default_job_definition
+ image: $CI_REGISTRY_IMAGE/ci-$NAME:latest
+ stage: builds
+ cache:
+ paths:
+ - ccache/
+ key: "$CI_JOB_NAME"
+ before_script:
+ - *script_variables
+ script:
+ - pushd "$PWD"
+ - mkdir -p "$SCRATCH_DIR"
+ - cd "$SCRATCH_DIR"
+ - git clone --depth 1 https://gitlab.com/libvirt/libvirt.git
+ - mkdir libvirt/build
+ - cd libvirt/build
+ - ../autogen.sh $CONFIGURE_OPTS --prefix="$VROOT"
+ - $MAKE install
+ - popd
+ - mkdir build
+ - cd build
+ - ../autogen.sh $CONFIGURE_OPTS || (cat config.log && exit 1)
+ - $MAKE
# Check that all commits are signed-off for the DCO.
# Skip on "libvirt" namespace, since we only need to run
@@ -14,3 +111,150 @@ check-dco:
except:
variables:
- $CI_PROJECT_NAMESPACE == 'libvirt'
+
+x64-centos-7-container:
+ <<: *container_job_definition
+ variables:
+ NAME: centos-7
+
+x64-centos-8-container:
+ <<: *container_job_definition
+ variables:
+ NAME: centos-8
+
+x64-centos-stream-container:
+ <<: *container_job_definition
+ variables:
+ NAME: centos-stream
+
+x64-debian-9-container:
+ <<: *container_job_definition
+ variables:
+ NAME: debian-9
+
+x64-debian-10-container:
+ <<: *container_job_definition
+ variables:
+ NAME: debian-10
+
+x64-debian-sid-container:
+ <<: *container_job_definition
+ variables:
+ NAME: debian-sid
+
+x64-fedora-31-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-31
+
+x64-fedora-32-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-32
+
+x64-fedora-rawhide-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-rawhide
+
+x64-opensuse-151-container:
+ <<: *container_job_definition
+ variables:
+ NAME: opensuse-151
+
+x64-ubuntu-1804-container:
+ <<: *container_job_definition
+ variables:
+ NAME: ubuntu-1804
+
+x64-ubuntu-2004-container:
+ <<: *container_job_definition
+ variables:
+ NAME: ubuntu-2004
+
+mingw32-fedora-rawhide-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-rawhide-cross-mingw32
+
+mingw64-fedora-rawhide-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-rawhide-cross-mingw64
+
+
+
+x64-centos-8-git-build:
+ <<: *git_native_build_job_definition
+ variables:
+ NAME: centos-8
+
+x64-centos-7-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: centos-7
+
+x64-centos-8-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: centos-8
+
+x64-centos-stream-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: centos-stream
+
+x64-debian-9-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: debian-9
+
+x64-debian-10-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: debian-10
+
+x64-debian-sid-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: debian-sid
+
+x64-fedora-31-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: fedora-31
+
+x64-fedora-32-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: fedora-32
+
+x64-fedora-rawhide-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: fedora-rawhide
+
+x64-opensuse-151-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: opensuse-151
+
+x64-ubuntu-1804-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: ubuntu-1804
+
+x64-ubuntu-2004-dist-build:
+ <<: *dist_native_build_job_definition
+ variables:
+ NAME: ubuntu-2004
+
+mingw32-fedora-rawhide-git-build:
+ <<: *git_cross_build_default_job_definition
+ variables:
+ NAME: fedora-rawhide-cross-mingw32
+
+mingw64-fedora-rawhide-git-build:
+ <<: *git_cross_build_default_job_definition
+ variables:
+ NAME: fedora-rawhide-cross-mingw64
diff --git a/ci/containers/README.rst b/ci/containers/README.rst
new file mode 100644
index 0000000..530897e
--- /dev/null
+++ b/ci/containers/README.rst
@@ -0,0 +1,14 @@
+CI job assets
+=============
+
+This directory contains assets used in the automated CI jobs, most
+notably the Dockerfiles used to build container images in which the
+CI jobs then run.
+
+The ``refresh`` script is used to re-create the Dockerfiles using the
+``lcitool`` command that is provided by repo
+https://gitlab.com/libvirt/libvirt-ci
+
+The containers are built during the CI process and cached in the GitLab
+container registry of the project doing the build. The cached containers
+can be deleted at any time and will be correctly rebuilt.
diff --git a/ci/containers/libvirt-centos-7.Dockerfile b/ci/containers/libvirt-centos-7.Dockerfile
new file mode 100644
index 0000000..ad6b262
--- /dev/null
+++ b/ci/containers/libvirt-centos-7.Dockerfile
@@ -0,0 +1,88 @@
+FROM centos:7
+
+RUN echo -e '[openvz]\n\
+name=OpenVZ addons\n\
+baseurl=https://download.openvz.org/virtuozzo/releases/openvz-7.0.11-235/x86_64/os/\n\
+enabled=1\n\
+gpgcheck=1\n\
+skip_if_unavailable=0\n\
+metadata_expire=6h\n\
+priority=90\n\
+includepkgs=libprl*' > /etc/yum.repos.d/openvz.repo && \
+ echo -e '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\
+Version: GnuPG v2.0.22 (GNU/Linux)\n\
+\n\
+mI0EVl80nQEEAKrEeyeTCwrzS9kYedZ/sAc/GUqlb81C7pA9SaR3fyck5mVw1Ogk\n\
+YdmNBPM2kY7QDxR9F0EpSpnxSCAXZXugsQ8KzZ0DRLVeBDQyGs9IGK5hI0zzxIil\n\
+BzfvIexLiQQhLy7YlIi8Jt/uUqKkW0pIMNMGcduY97VATtczpncpkmSzABEBAAG0\n\
+SFZpcnR1b3p6byBUZWFtIChHUEcga2V5IHNpZ25hdHVyZSBmb3IgcGFja2FnZXMp\n\
+IDxzZWN1cml0eUB2aXJ0dW96em8uY29tPoi5BBMBAgAjBQJWXzSdAhsDBwsJCAcD\n\
+AgEGFQgCCQoLBBYCAwECHgECF4AACgkQygt9GUTNrSruIgP/er70Eyo73A1gfrjv\n\
+oPUkyo4rslVRZu3qqCwoMFtJc/Z/UxWgEka1buorlcGLa6eO/EZ49c0n+KGa4Kvt\n\
+EUboIq0yEu5i0FyAj92ifm+hNhoAbGfm0cZ4/fD0oGr3l8OsQo4+iHX4xAPwFe7Y\n\
+zABuB8I1ZDZ4OIp5tDfTTuF2LT24jQRWXzSdAQQAog2Aqb+Ptl68O7cQhWLjVGkj\n\
+yyigZrdeReLx3HloKJPBeQ/kA6uvMJc/IYS3uppMWXv9v+QenS6uhP1TUJ2k9FvM\n\
+t94MQZfALN7Vpf8AF+UeWu4Ru+y4BNzcFhrPhIFNFChOR2QqW6FkgE57D9I177NC\n\
+oJMyrlNe8wcGa178An8AEQEAAYifBBgBAgAJBQJWXzSdAhsMAAoJEMoLfRlEza0q\n\
+bKwD/3+OFVIEXnIv5XgdGRNX5fHggsUN1bb8gva7HANRlKdd4LD8foDM3F/yv/3V\n\
+igG14D5EjKz56SaBDNgiI4++hOzb2M8jhAsR86jxkXFrrP1U3ZNRKg6av9DPFAPS\n\
+WEiJKtQrZDJloqtyi/mmRa1VsV7RYR0VPJjhK/R8EQ7Ysshy\n\
+=fRMg\n\
+-----END PGP PUBLIC KEY BLOCK-----' > /etc/pki/rpm-gpg/RPM-GPG-KEY-OpenVZ && \
+ rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-OpenVZ && \
+ yum install -y epel-release && \
+ yum update -y && \
+ yum install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-common \
+ glibc-devel \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-pip \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ yum autoremove -y && \
+ yum clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+RUN pip3 install \
+ meson==0.49.0
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja-build"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-centos-8.Dockerfile b/ci/containers/libvirt-centos-8.Dockerfile
new file mode 100644
index 0000000..360cf08
--- /dev/null
+++ b/ci/containers/libvirt-centos-8.Dockerfile
@@ -0,0 +1,64 @@
+FROM centos:8
+
+RUN dnf install 'dnf-command(config-manager)' -y && \
+ dnf config-manager --set-enabled -y PowerTools && \
+ dnf install -y epel-release && \
+ dnf update -y && \
+ dnf install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ gobject-introspection-devel \
+ gtk-doc \
+ libnl3-devel \
+ libtirpc-devel \
+ libtool \
+ libvirt-devel \
+ libxml2 \
+ libxml2-devel \
+ libxslt \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-docutils \
+ python3-setuptools \
+ python3-wheel \
+ rpcgen \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-centos-stream.Dockerfile b/ci/containers/libvirt-centos-stream.Dockerfile
new file mode 100644
index 0000000..6f6c830
--- /dev/null
+++ b/ci/containers/libvirt-centos-stream.Dockerfile
@@ -0,0 +1,58 @@
+FROM centos:8
+
+RUN dnf install -y centos-release-stream && \
+ dnf install 'dnf-command(config-manager)' -y && \
+ dnf config-manager --set-enabled -y Stream-PowerTools && \
+ dnf install -y epel-release && \
+ dnf update -y && \
+ dnf install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-debian-10.Dockerfile b/ci/containers/libvirt-debian-10.Dockerfile
new file mode 100644
index 0000000..f55fe06
--- /dev/null
+++ b/ci/containers/libvirt-debian-10.Dockerfile
@@ -0,0 +1,58 @@
+FROM debian:10
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get dist-upgrade -y && \
+ apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ autopoint \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ git \
+ gtk-doc-tools \
+ libc6-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libtool \
+ libtool-bin \
+ libvirt-dev \
+ libxml2-dev \
+ locales \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconf \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ screen \
+ strace \
+ sudo \
+ valac \
+ vim && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
+ dpkg-reconfigure locales && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-debian-9.Dockerfile b/ci/containers/libvirt-debian-9.Dockerfile
new file mode 100644
index 0000000..182b3a6
--- /dev/null
+++ b/ci/containers/libvirt-debian-9.Dockerfile
@@ -0,0 +1,61 @@
+FROM debian:9
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get dist-upgrade -y && \
+ apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ autopoint \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ git \
+ gtk-doc-tools \
+ libc6-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libtool \
+ libtool-bin \
+ libvirt-dev \
+ libxml2-dev \
+ locales \
+ lsof \
+ make \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconf \
+ python3 \
+ python3-pip \
+ python3-setuptools \
+ python3-wheel \
+ screen \
+ strace \
+ sudo \
+ valac \
+ vim && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
+ dpkg-reconfigure locales && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+RUN pip3 install \
+ meson==0.49.0
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-debian-sid.Dockerfile b/ci/containers/libvirt-debian-sid.Dockerfile
new file mode 100644
index 0000000..fbb1cb6
--- /dev/null
+++ b/ci/containers/libvirt-debian-sid.Dockerfile
@@ -0,0 +1,58 @@
+FROM debian:sid
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get dist-upgrade -y && \
+ apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ autopoint \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ git \
+ gtk-doc-tools \
+ libc6-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libtool \
+ libtool-bin \
+ libvirt-dev \
+ libxml2-dev \
+ locales \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconf \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ screen \
+ strace \
+ sudo \
+ valac \
+ vim && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
+ dpkg-reconfigure locales && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-fedora-31.Dockerfile b/ci/containers/libvirt-fedora-31.Dockerfile
new file mode 100644
index 0000000..e23f6d5
--- /dev/null
+++ b/ci/containers/libvirt-fedora-31.Dockerfile
@@ -0,0 +1,55 @@
+FROM fedora:31
+
+RUN dnf update -y && \
+ dnf install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-fedora-32.Dockerfile b/ci/containers/libvirt-fedora-32.Dockerfile
new file mode 100644
index 0000000..1da98c3
--- /dev/null
+++ b/ci/containers/libvirt-fedora-32.Dockerfile
@@ -0,0 +1,55 @@
+FROM fedora:32
+
+RUN dnf update -y && \
+ dnf install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-fedora-rawhide-cross-mingw32.Dockerfile b/ci/containers/libvirt-fedora-rawhide-cross-mingw32.Dockerfile
new file mode 100644
index 0000000..c366c5f
--- /dev/null
+++ b/ci/containers/libvirt-fedora-rawhide-cross-mingw32.Dockerfile
@@ -0,0 +1,133 @@
+FROM fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf update -y && \
+ dnf install -y \
+ audit-libs-devel \
+ augeas \
+ autoconf \
+ automake \
+ avahi-devel \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ cyrus-sasl-devel \
+ dbus-devel \
+ device-mapper-devel \
+ dnsmasq \
+ dwarves \
+ ebtables \
+ fuse-devel \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ glusterfs-api-devel \
+ gnutls-devel \
+ gobject-introspection-devel \
+ gtk-doc \
+ iproute \
+ iproute-tc \
+ iscsi-initiator-utils \
+ kmod \
+ libacl-devel \
+ libattr-devel \
+ libblkid-devel \
+ libcap-ng-devel \
+ libcurl-devel \
+ libiscsi-devel \
+ libnl3-devel \
+ libpcap-devel \
+ libpciaccess-devel \
+ librbd-devel \
+ libselinux-devel \
+ libssh-devel \
+ libssh2-devel \
+ libtirpc-devel \
+ libtool \
+ libudev-devel \
+ libwsman-devel \
+ libxml2 \
+ libxml2-devel \
+ libxslt \
+ lsof \
+ lvm2 \
+ make \
+ meson \
+ ncurses-devel \
+ net-tools \
+ netcf-devel \
+ nfs-utils \
+ ninja-build \
+ numactl-devel \
+ numad \
+ parted \
+ parted-devel \
+ patch \
+ perl \
+ pkgconfig \
+ polkit \
+ python3 \
+ python3-docutils \
+ python3-flake8 \
+ python3-setuptools \
+ python3-wheel \
+ qemu-img \
+ radvd \
+ readline-devel \
+ rpcgen \
+ rpm-build \
+ sanlock-devel \
+ screen \
+ scrub \
+ sheepdog \
+ strace \
+ sudo \
+ systemtap-sdt-devel \
+ vala \
+ vim \
+ wireshark-devel \
+ xen-devel \
+ xfsprogs-devel \
+ yajl-devel \
+ zfs-fuse && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-$(basename /usr/bin/gcc)
+
+RUN dnf install -y \
+ mingw32-curl \
+ mingw32-dbus \
+ mingw32-dlfcn \
+ mingw32-gcc \
+ mingw32-gettext \
+ mingw32-glib2 \
+ mingw32-gnutls \
+ mingw32-libssh2 \
+ mingw32-libxml2 \
+ mingw32-openssl \
+ mingw32-pkg-config \
+ mingw32-portablexdr \
+ mingw32-readline && \
+ dnf clean all -y
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "i686-w64-mingw32"
+ENV CONFIGURE_OPTS "--host=i686-w64-mingw32"
+ENV MESON_OPTS "--cross-file=/usr/share/mingw/toolchain-mingw32.meson"
diff --git a/ci/containers/libvirt-fedora-rawhide-cross-mingw64.Dockerfile b/ci/containers/libvirt-fedora-rawhide-cross-mingw64.Dockerfile
new file mode 100644
index 0000000..1c5c07c
--- /dev/null
+++ b/ci/containers/libvirt-fedora-rawhide-cross-mingw64.Dockerfile
@@ -0,0 +1,133 @@
+FROM fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf update -y && \
+ dnf install -y \
+ audit-libs-devel \
+ augeas \
+ autoconf \
+ automake \
+ avahi-devel \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ cyrus-sasl-devel \
+ dbus-devel \
+ device-mapper-devel \
+ dnsmasq \
+ dwarves \
+ ebtables \
+ fuse-devel \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ glusterfs-api-devel \
+ gnutls-devel \
+ gobject-introspection-devel \
+ gtk-doc \
+ iproute \
+ iproute-tc \
+ iscsi-initiator-utils \
+ kmod \
+ libacl-devel \
+ libattr-devel \
+ libblkid-devel \
+ libcap-ng-devel \
+ libcurl-devel \
+ libiscsi-devel \
+ libnl3-devel \
+ libpcap-devel \
+ libpciaccess-devel \
+ librbd-devel \
+ libselinux-devel \
+ libssh-devel \
+ libssh2-devel \
+ libtirpc-devel \
+ libtool \
+ libudev-devel \
+ libwsman-devel \
+ libxml2 \
+ libxml2-devel \
+ libxslt \
+ lsof \
+ lvm2 \
+ make \
+ meson \
+ ncurses-devel \
+ net-tools \
+ netcf-devel \
+ nfs-utils \
+ ninja-build \
+ numactl-devel \
+ numad \
+ parted \
+ parted-devel \
+ patch \
+ perl \
+ pkgconfig \
+ polkit \
+ python3 \
+ python3-docutils \
+ python3-flake8 \
+ python3-setuptools \
+ python3-wheel \
+ qemu-img \
+ radvd \
+ readline-devel \
+ rpcgen \
+ rpm-build \
+ sanlock-devel \
+ screen \
+ scrub \
+ sheepdog \
+ strace \
+ sudo \
+ systemtap-sdt-devel \
+ vala \
+ vim \
+ wireshark-devel \
+ xen-devel \
+ xfsprogs-devel \
+ yajl-devel \
+ zfs-fuse && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-$(basename /usr/bin/gcc)
+
+RUN dnf install -y \
+ mingw64-curl \
+ mingw64-dbus \
+ mingw64-dlfcn \
+ mingw64-gcc \
+ mingw64-gettext \
+ mingw64-glib2 \
+ mingw64-gnutls \
+ mingw64-libssh2 \
+ mingw64-libxml2 \
+ mingw64-openssl \
+ mingw64-pkg-config \
+ mingw64-portablexdr \
+ mingw64-readline && \
+ dnf clean all -y
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "x86_64-w64-mingw32"
+ENV CONFIGURE_OPTS "--host=x86_64-w64-mingw32"
+ENV MESON_OPTS "--cross-file=/usr/share/mingw/toolchain-mingw64.meson"
diff --git a/ci/containers/libvirt-fedora-rawhide.Dockerfile b/ci/containers/libvirt-fedora-rawhide.Dockerfile
new file mode 100644
index 0000000..7017282
--- /dev/null
+++ b/ci/containers/libvirt-fedora-rawhide.Dockerfile
@@ -0,0 +1,56 @@
+FROM fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf update -y && \
+ dnf install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-langpack-en \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-opensuse-151.Dockerfile b/ci/containers/libvirt-opensuse-151.Dockerfile
new file mode 100644
index 0000000..87237d4
--- /dev/null
+++ b/ci/containers/libvirt-opensuse-151.Dockerfile
@@ -0,0 +1,57 @@
+FROM opensuse/leap:15.1
+
+RUN zypper update -y && \
+ zypper install -y \
+ autoconf \
+ automake \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ cppi \
+ gcc \
+ gdb \
+ gettext \
+ gettext-devel \
+ git \
+ glib2-devel \
+ glibc-devel \
+ glibc-locale \
+ gobject-introspection-devel \
+ gtk-doc \
+ libtool \
+ libvirt-devel \
+ libxml2-devel \
+ lsof \
+ make \
+ net-tools \
+ ninja \
+ patch \
+ perl \
+ pkgconfig \
+ python3 \
+ python3-pip \
+ python3-setuptools \
+ python3-wheel \
+ rpm-build \
+ screen \
+ strace \
+ sudo \
+ vala \
+ vim && \
+ zypper clean --all && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+RUN pip3 install \
+ meson==0.49.0
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-ubuntu-1804.Dockerfile b/ci/containers/libvirt-ubuntu-1804.Dockerfile
new file mode 100644
index 0000000..2b8bd41
--- /dev/null
+++ b/ci/containers/libvirt-ubuntu-1804.Dockerfile
@@ -0,0 +1,61 @@
+FROM ubuntu:18.04
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get dist-upgrade -y && \
+ apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ autopoint \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ git \
+ gtk-doc-tools \
+ libc6-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libtool \
+ libtool-bin \
+ libvirt-dev \
+ libxml2-dev \
+ locales \
+ lsof \
+ make \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconf \
+ python3 \
+ python3-pip \
+ python3-setuptools \
+ python3-wheel \
+ screen \
+ strace \
+ sudo \
+ valac \
+ vim && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
+ dpkg-reconfigure locales && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+RUN pip3 install \
+ meson==0.49.0
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/libvirt-ubuntu-2004.Dockerfile b/ci/containers/libvirt-ubuntu-2004.Dockerfile
new file mode 100644
index 0000000..38920f0
--- /dev/null
+++ b/ci/containers/libvirt-ubuntu-2004.Dockerfile
@@ -0,0 +1,58 @@
+FROM ubuntu:20.04
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get dist-upgrade -y && \
+ apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ autopoint \
+ bash \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ chrony \
+ gcc \
+ gdb \
+ gettext \
+ git \
+ gtk-doc-tools \
+ libc6-dev \
+ libgirepository1.0-dev \
+ libglib2.0-dev \
+ libtool \
+ libtool-bin \
+ libvirt-dev \
+ libxml2-dev \
+ locales \
+ lsof \
+ make \
+ meson \
+ net-tools \
+ ninja-build \
+ patch \
+ perl \
+ pkgconf \
+ python3 \
+ python3-setuptools \
+ python3-wheel \
+ screen \
+ strace \
+ sudo \
+ valac \
+ vim && \
+ apt-get autoremove -y && \
+ apt-get autoclean -y && \
+ sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
+ dpkg-reconfigure locales && \
+ mkdir -p /usr/libexec/ccache-wrappers && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+
+ENV MAKE "/usr/bin/make"
+ENV NINJA "/usr/bin/ninja"
+ENV PYTHON "/usr/bin/python3"
+
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/refresh b/ci/containers/refresh
new file mode 100755
index 0000000..dfbfa87
--- /dev/null
+++ b/ci/containers/refresh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+if test -z "$1"
+then
+ echo "syntax: $0 PATH-TO-LCITOOL"
+ exit 1
+fi
+
+LCITOOL=$1
+
+if ! test -x "$LCITOOL"
+then
+ echo "$LCITOOL is not executable"
+ exit 1
+fi
+
+HOSTS=$($LCITOOL hosts | grep -v freebsd)
+
+for host in $HOSTS
+do
+
+ if test "$host" = "libvirt-fedora-rawhide"
+ then
+ for cross in mingw32 mingw64
+ do
+ $LCITOOL dockerfile $host libvirt,libvirt-glib --cross $cross >$host-cross-$cross.Dockerfile
+ done
+ fi
+
+ if test "$host" = "libvirt-centos-8"
+ then
+ $LCITOOL dockerfile $host libvirt+minimal,libvirt+dist,libvirt-glib > $host.Dockerfile
+ else
+ $LCITOOL dockerfile $host libvirt+dist,libvirt-glib > $host.Dockerfile
+ fi
+done
--
2.26.2
4 years, 6 months
[libvirt PATCH] ci: Makefile: Mention CI_MAKE_ARGS and CI_CONFIGURE_ARGS in ci-help
by Erik Skultety
Document the CI_MAKE_ARGS and CI_CONFIGURE_ARGS so that users don't have
to skim through the Makefile to be able to pass arbitrary recognized
make targets to the build system.
Signed-off-by: Erik Skultety <eskultet(a)redhat.com>
---
ci/Makefile | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ci/Makefile b/ci/Makefile
index 7840cc8d89..df60e6bf3c 100644
--- a/ci/Makefile
+++ b/ci/Makefile
@@ -266,4 +266,6 @@ ci-help:
@echo " CI_CLEAN=0 - do not delete '$(CI_SCRATCHDIR)' after completion"
@echo " CI_REUSE=1 - re-use existing '$(CI_SCRATCHDIR)' content"
@echo " CI_ENGINE=auto - container engine to use (podman, docker)"
+ @echo " CI_CONFIGURE_ARGS= - extra arguments passed to configure"
+ @echo " CI_MAKE_ARGS= - extra arguments passed to make, e.g. space delimited list of make targets"
@echo
--
2.26.2
4 years, 6 months
Re: ovmf / PCI passthrough impaired due to very limiting PCI64 aperture
by Eduardo Habkost
+libvir-list
On Wed, Jun 17, 2020 at 05:04:12PM +0100, Dr. David Alan Gilbert wrote:
> * Eduardo Habkost (ehabkost(a)redhat.com) wrote:
> > On Wed, Jun 17, 2020 at 02:46:52PM +0100, Dr. David Alan Gilbert wrote:
> > > * Laszlo Ersek (lersek(a)redhat.com) wrote:
> > > > On 06/16/20 19:14, Guilherme Piccoli wrote:
> > > > > Thanks Gerd, Dave and Eduardo for the prompt responses!
> > > > >
> > > > > So, I understand that when we use "-host-physical-bits", we are
> > > > > passing the *real* number for the guest, correct? So, in this case we
> > > > > can trust that the guest physbits matches the true host physbits.
> > > > >
> > > > > What if then we have OVMF relying in the physbits *iff*
> > > > > "-host-phys-bits" is used (which is the default in RH and a possible
> > > > > machine configuration on libvirt XML in Ubuntu), and we have OVMF
> > > > > fallbacks to 36-bit otherwise?
> > > >
> > > > I've now read the commit message on QEMU commit 258fe08bd341d, and the
> > > > complexity is simply stunning.
> > > >
> > > > Right now, OVMF calculates the guest physical address space size from
> > > > various range sizes (such as hotplug memory area end, default or
> > > > user-configured PCI64 MMIO aperture), and derives the minimum suitable
> > > > guest-phys address width from that address space size. This width is
> > > > then exposed to the rest of the firmware with the CPU HOB (hand-off
> > > > block), which in turn controls how the GCD (global coherency domain)
> > > > memory space map is sized. Etc.
> > > >
> > > > If QEMU can provide a *reliable* GPA width, in some info channel (CPUID
> > > > or even fw_cfg), then the above calculation could be reversed in OVMF.
> > > > We could take the width as a given (-> produce the CPU HOB directly),
> > > > plus calculate the *remaining* address space between the GPA space size
> > > > given by the width, and the end of the memory hotplug area end. If the
> > > > "remaining size" were negative, then obviously QEMU would have been
> > > > misconfigured, so we'd halt the boot. Otherwise, the remaining area
> > > > could be used as PCI64 MMIO aperture (PEI memory footprint of DXE page
> > > > tables be darned).
> > > >
> > > > > Now, regarding the problem "to trust or not" in the guests' physbits,
> > > > > I think it's an orthogonal discussion to some extent. It'd be nice to
> > > > > have that check, and as Eduardo said, prevent migration in such cases.
> > > > > But it's not really preventing OVMF big PCI64 aperture if we only
> > > > > increase the aperture _when "-host-physical-bits" is used_.
> > > >
> > > > I don't know what exactly those flags do, but I doubt they are clearly
> > > > visible to OVMF in any particular way.
> > >
> > > The firmware should trust whatever it reads from the cpuid and thus gets
> > > told from qemu; if qemu is doing the wrong thing there then that's our
> > > problem and we need to fix it in qemu.
> >
> > It is impossible to provide a MAXPHYADDR that the guest can trust
> > unconditionally and allow live migration to hosts with different
> > sizes at the same time.
>
> It would be nice to get to a point where we could say that the reported
> size is no bigger than the physical hardware.
> The gotcha here is that (upstream) qemu is still reporting 40 by default
> when even modern Intel desktop chips are 39.
I agree it would be nice. We just need a method to tell guest
software that we are really making this additional guarantee.
>
> > Unless we want to drop support live migration to hosts with
> > different sizes entirely, we need additional bits to tell the
> > guest how much it can trust MAXPHYADDR.
>
> Could we go with host-phys-bits=true by default, that at least means the
> normal behaviour is correct; if people want to migrate between different
> hosts with different sizes they should set phys-bits (or
> host-phys-limit) to the lowest in their set of hardware.
Host-dependent defaults may be convenient for end users running
QEMU directly, but not a good idea if a stable guest ABI is
expected from your VM configuration (which is the case for
software using the libvirt API).
--
Eduardo
4 years, 6 months
Re: ovmf / PCI passthrough impaired due to very limiting PCI64 aperture
by Eduardo Habkost
+libvir-list
On Wed, Jun 17, 2020 at 05:04:12PM +0100, Dr. David Alan Gilbert wrote:
> * Eduardo Habkost (ehabkost(a)redhat.com) wrote:
> > On Wed, Jun 17, 2020 at 02:46:52PM +0100, Dr. David Alan Gilbert wrote:
> > > * Laszlo Ersek (lersek(a)redhat.com) wrote:
> > > > On 06/16/20 19:14, Guilherme Piccoli wrote:
> > > > > Thanks Gerd, Dave and Eduardo for the prompt responses!
> > > > >
> > > > > So, I understand that when we use "-host-physical-bits", we are
> > > > > passing the *real* number for the guest, correct? So, in this case we
> > > > > can trust that the guest physbits matches the true host physbits.
> > > > >
> > > > > What if then we have OVMF relying in the physbits *iff*
> > > > > "-host-phys-bits" is used (which is the default in RH and a possible
> > > > > machine configuration on libvirt XML in Ubuntu), and we have OVMF
> > > > > fallbacks to 36-bit otherwise?
> > > >
> > > > I've now read the commit message on QEMU commit 258fe08bd341d, and the
> > > > complexity is simply stunning.
> > > >
> > > > Right now, OVMF calculates the guest physical address space size from
> > > > various range sizes (such as hotplug memory area end, default or
> > > > user-configured PCI64 MMIO aperture), and derives the minimum suitable
> > > > guest-phys address width from that address space size. This width is
> > > > then exposed to the rest of the firmware with the CPU HOB (hand-off
> > > > block), which in turn controls how the GCD (global coherency domain)
> > > > memory space map is sized. Etc.
> > > >
> > > > If QEMU can provide a *reliable* GPA width, in some info channel (CPUID
> > > > or even fw_cfg), then the above calculation could be reversed in OVMF.
> > > > We could take the width as a given (-> produce the CPU HOB directly),
> > > > plus calculate the *remaining* address space between the GPA space size
> > > > given by the width, and the end of the memory hotplug area end. If the
> > > > "remaining size" were negative, then obviously QEMU would have been
> > > > misconfigured, so we'd halt the boot. Otherwise, the remaining area
> > > > could be used as PCI64 MMIO aperture (PEI memory footprint of DXE page
> > > > tables be darned).
> > > >
> > > > > Now, regarding the problem "to trust or not" in the guests' physbits,
> > > > > I think it's an orthogonal discussion to some extent. It'd be nice to
> > > > > have that check, and as Eduardo said, prevent migration in such cases.
> > > > > But it's not really preventing OVMF big PCI64 aperture if we only
> > > > > increase the aperture _when "-host-physical-bits" is used_.
> > > >
> > > > I don't know what exactly those flags do, but I doubt they are clearly
> > > > visible to OVMF in any particular way.
> > >
> > > The firmware should trust whatever it reads from the cpuid and thus gets
> > > told from qemu; if qemu is doing the wrong thing there then that's our
> > > problem and we need to fix it in qemu.
> >
> > It is impossible to provide a MAXPHYADDR that the guest can trust
> > unconditionally and allow live migration to hosts with different
> > sizes at the same time.
>
> It would be nice to get to a point where we could say that the reported
> size is no bigger than the physical hardware.
> The gotcha here is that (upstream) qemu is still reporting 40 by default
> when even modern Intel desktop chips are 39.
I agree it would be nice. We just need a method to tell guest
software that we are really making this additional guarantee.
>
> > Unless we want to drop support live migration to hosts with
> > different sizes entirely, we need additional bits to tell the
> > guest how much it can trust MAXPHYADDR.
>
> Could we go with host-phys-bits=true by default, that at least means the
> normal behaviour is correct; if people want to migrate between different
> hosts with different sizes they should set phys-bits (or
> host-phys-limit) to the lowest in their set of hardware.
Host-dependent defaults may be convenient for end users running
QEMU directly, but not a good idea if a stable guest ABI is
expected from your VM configuration (which is the case for
software using the libvirt API).
--
Eduardo
4 years, 6 months
[libvirt PATCH 0/3] Remove obsolete conditionals
by Daniel P. Berrangé
Given our platform support matrix we can cull many conditionally
defined constants and rely on system headers
Daniel P. Berrangé (3):
lxc: drop compat code for mount constants
lxc: drop compat code for clone constants
lxc: drop compat code for capability constants
src/lxc/lxc_container.c | 151 ---------------------------------------
src/lxc/lxc_controller.c | 8 ---
2 files changed, 159 deletions(-)
--
2.24.1
4 years, 6 months