[libvirt] [PATCH 0/4] tests: Fix 'make check' on FreeBSD

macOS still chokes on it, but hey, it's something. Andrea Bolognani (4): tests: Fix virnetsockettest on FreeBSD tests: Fix qemumemlocktest on FreeBSD tests: Fix qemuxml2xmltest on FreeBSD tests: Fix qemuxml2argvtest on FreeBSD tests/qemumemlocktest.c | 12 ++++++++++++ tests/qemuxml2argvtest.c | 23 +++++++++++++++++++++++ tests/qemuxml2xmltest.c | 3 +++ tests/virnetsockettest.c | 10 ++++++++++ 4 files changed, 48 insertions(+) -- 2.14.3

FreeBSD doesn't let IPv4 clients to connect to IPv6 sockets, so one of our test cases has to be compiled out there. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/virnetsockettest.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 9f9a243484..d39481067e 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -470,9 +470,19 @@ mymain(void) if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; + /* From FreeBSD's inet6(4): + * + * By default, FreeBSD does not route IPv4 traffic to AF_INET6 + * sockets. The default behavior intentionally violates RFC2553 + * for security reasons. Listen to two sockets if you want to + * accept both IPv4 and IPv6 traffic. + * + * So this test will never work on FreeBSD, and need to skip it. */ +# ifndef __FreeBSD__ tcpData.cnode = "::1"; if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; +# endif /* __FreeBSD__ */ } #endif -- 2.14.3

On Fri, Apr 27, 2018 at 05:21:20PM +0200, Andrea Bolognani wrote:
FreeBSD doesn't let IPv4 clients to connect to IPv6 sockets, so one of our test cases has to be compiled out there.
Yep, IPV6_V6ONLY is set to true by default, where as it is false by default on Linux, however, .....
Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/virnetsockettest.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 9f9a243484..d39481067e 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -470,9 +470,19 @@ mymain(void) if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1;
+ /* From FreeBSD's inet6(4): + * + * By default, FreeBSD does not route IPv4 traffic to AF_INET6 + * sockets. The default behavior intentionally violates RFC2553 + * for security reasons. Listen to two sockets if you want to + * accept both IPv4 and IPv6 traffic. + * + * So this test will never work on FreeBSD, and need to skip it. */
This code is not supposed to be relying on IPV6_V6ONLY. The testSocketTCPAccept method is supposed to create multiple listener sockets. We passing NULL as the listen address, which means we are supposed to get two sockets, one listening on IPv4 and one on IPv6. So the comment is right about FreeBSD being different but that situation should not apply to this test AFAIK. So I'm wondering why it hasn't listened on both sockets...
+# ifndef __FreeBSD__ tcpData.cnode = "::1"; if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; +# endif /* __FreeBSD__ */ } #endif
-- 2.14.3
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, 2018-04-27 at 16:32 +0100, Daniel P. Berrangé wrote:
+ /* From FreeBSD's inet6(4): + * + * By default, FreeBSD does not route IPv4 traffic to AF_INET6 + * sockets. The default behavior intentionally violates RFC2553 + * for security reasons. Listen to two sockets if you want to + * accept both IPv4 and IPv6 traffic. + * + * So this test will never work on FreeBSD, and need to skip it. */
This code is not supposed to be relying on IPV6_V6ONLY. The testSocketTCPAccept method is supposed to create multiple listener sockets. We passing NULL as the listen address, which means we are supposed to get two sockets, one listening on IPv4 and one on IPv6. So the comment is right about FreeBSD being different but that situation should not apply to this test AFAIK.
So I'm wondering why it hasn't listened on both sockets...
Mh, you're right, the IPv6 thing was just a red herring: the test case just seems to fail or succeed pretty much randomly. I tried compiling out everything but the basic "Socket TCP/IPv4 Accept" part, and even that didn't manage to run successfully for any extended lenght of time in a tight loop. I'm afraid we're going to need someone with more network expertise than I have to look into it. -- Andrea Bolognani / Red Hat / Virtualization

On Mon, Apr 30, 2018 at 10:29:46AM +0200, Andrea Bolognani wrote:
On Fri, 2018-04-27 at 16:32 +0100, Daniel P. Berrangé wrote:
+ /* From FreeBSD's inet6(4): + * + * By default, FreeBSD does not route IPv4 traffic to AF_INET6 + * sockets. The default behavior intentionally violates RFC2553 + * for security reasons. Listen to two sockets if you want to + * accept both IPv4 and IPv6 traffic. + * + * So this test will never work on FreeBSD, and need to skip it. */
This code is not supposed to be relying on IPV6_V6ONLY. The testSocketTCPAccept method is supposed to create multiple listener sockets. We passing NULL as the listen address, which means we are supposed to get two sockets, one listening on IPv4 and one on IPv6. So the comment is right about FreeBSD being different but that situation should not apply to this test AFAIK.
So I'm wondering why it hasn't listened on both sockets...
Mh, you're right, the IPv6 thing was just a red herring: the test case just seems to fail or succeed pretty much randomly.
I tried compiling out everything but the basic "Socket TCP/IPv4 Accept" part, and even that didn't manage to run successfully for any extended lenght of time in a tight loop.
I'm afraid we're going to need someone with more network expertise than I have to look into it.
This kind of nastiness usually requires an strace log (or whatever BSD equiv is) to diagnose. I've got a BSD VM I can try on Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

When hostdevs are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemumemlocktest.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c index bc0b53e6fa..1e5d06ea96 100644 --- a/tests/qemumemlocktest.c +++ b/tests/qemumemlocktest.c @@ -120,12 +120,18 @@ mymain(void) DO_TEST("pc-hardlimit", 2147483648); DO_TEST("pc-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); + +# ifdef __linux__ DO_TEST("pc-hostdev", 2147483648); +# endif /* __linux */ DO_TEST("pc-hardlimit+locked", 2147483648); + +# ifdef __linux__ DO_TEST("pc-hardlimit+hostdev", 2147483648); DO_TEST("pc-hardlimit+locked+hostdev", 2147483648); DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); +# endif /* __linux */ qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64); if (!(qemuCaps = virQEMUCapsNew())) { @@ -144,12 +150,18 @@ mymain(void) DO_TEST("pseries-hardlimit", 2147483648); DO_TEST("pseries-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); + +# ifdef __linux__ DO_TEST("pseries-hostdev", 4320133120); +# endif /* __linux */ DO_TEST("pseries-hardlimit+locked", 2147483648); + +# ifdef __linux__ DO_TEST("pseries-hardlimit+hostdev", 2147483648); DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648); DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); +# endif /* __linux */ cleanup: virObjectUnref(qemuCaps); -- 2.14.3

On Fri, Apr 27, 2018 at 05:21:21PM +0200, Andrea Bolognani wrote:
When hostdevs are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out.
Our test suite isn't supposed to touch /sysfs from the real host at all. Sounds like we either need to mock out the function that's doing that, or provide some fake sysfs data in a tests/ subdirectory to run against with a mock'd open() call. That would make it work even on non-Linux I hope. Same for the other 2 patches following this.
Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemumemlocktest.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c index bc0b53e6fa..1e5d06ea96 100644 --- a/tests/qemumemlocktest.c +++ b/tests/qemumemlocktest.c @@ -120,12 +120,18 @@ mymain(void)
DO_TEST("pc-hardlimit", 2147483648); DO_TEST("pc-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); + +# ifdef __linux__ DO_TEST("pc-hostdev", 2147483648); +# endif /* __linux */
DO_TEST("pc-hardlimit+locked", 2147483648); + +# ifdef __linux__ DO_TEST("pc-hardlimit+hostdev", 2147483648); DO_TEST("pc-hardlimit+locked+hostdev", 2147483648); DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); +# endif /* __linux */
qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64); if (!(qemuCaps = virQEMUCapsNew())) { @@ -144,12 +150,18 @@ mymain(void)
DO_TEST("pseries-hardlimit", 2147483648); DO_TEST("pseries-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); + +# ifdef __linux__ DO_TEST("pseries-hostdev", 4320133120); +# endif /* __linux */
DO_TEST("pseries-hardlimit+locked", 2147483648); + +# ifdef __linux__ DO_TEST("pseries-hardlimit+hostdev", 2147483648); DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648); DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED); +# endif /* __linux */
cleanup: virObjectUnref(qemuCaps); -- 2.14.3
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, 2018-04-27 at 16:35 +0100, Daniel P. Berrangé wrote:
On Fri, Apr 27, 2018 at 05:21:21PM +0200, Andrea Bolognani wrote:
When hostdevs are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out.
Our test suite isn't supposed to touch /sysfs from the real host at all. Sounds like we either need to mock out the function that's doing that, or provide some fake sysfs data in a tests/ subdirectory to run against with a mock'd open() call. That would make it work even on non-Linux I hope.
Sorry, I should have provided some more context, but I was in a bit of a hurry on Friday when I sent this. We are already mocking (parts of) sysfs through virpcimock, but the contents of that file are compiled out on non-Linux; after removing the #ifdefs, it's fairly easy to solve most of the build issues on FreeBSD (draft patch attached), but there's one I couldn't quite get rid of. Mocking canonicalize_file_name() causes a linking error: ../gnulib/lib/.libs/libgnu.a(canonicalize-lgpl.o): In function `canonicalize_file_name': .../libvirt/gnulib/lib/canonicalize-lgpl.c:417: multiple definition of `canonicalize_file_name' .libs/virpcimock.o:.../libvirt/tests/virpcimock.c:983: first defined here This is not a problem on Linux, where canonicalize_file_name() is provided by libc, but FreeBSD is using the gnulib implementation instead, leading to the issue above. Can you think of a way to make linking of virpcimock work despite the above? That should get us to the point where at least qemumemlocktest and qemuxml2xmltest are working; qemuxml2argvtest will probably need more mocking because of NUMA information. -- Andrea Bolognani / Red Hat / Virtualization

On Mon, Apr 30, 2018 at 11:47:33AM +0200, Andrea Bolognani wrote:
On Fri, 2018-04-27 at 16:35 +0100, Daniel P. Berrangé wrote:
On Fri, Apr 27, 2018 at 05:21:21PM +0200, Andrea Bolognani wrote:
When hostdevs are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out.
Our test suite isn't supposed to touch /sysfs from the real host at all. Sounds like we either need to mock out the function that's doing that, or provide some fake sysfs data in a tests/ subdirectory to run against with a mock'd open() call. That would make it work even on non-Linux I hope.
Sorry, I should have provided some more context, but I was in a bit of a hurry on Friday when I sent this.
We are already mocking (parts of) sysfs through virpcimock, but the contents of that file are compiled out on non-Linux; after removing the #ifdefs, it's fairly easy to solve most of the build issues on FreeBSD (draft patch attached), but there's one I couldn't quite get rid of.
Mocking canonicalize_file_name() causes a linking error:
../gnulib/lib/.libs/libgnu.a(canonicalize-lgpl.o): In function `canonicalize_file_name': .../libvirt/gnulib/lib/canonicalize-lgpl.c:417: multiple definition of `canonicalize_file_name' .libs/virpcimock.o:.../libvirt/tests/virpcimock.c:983: first defined here
This is not a problem on Linux, where canonicalize_file_name() is provided by libc, but FreeBSD is using the gnulib implementation instead, leading to the issue above.
AFAIK, the only way is to not link virpcimock.la to gnulib. If we're lucky all the functions it needs would be present in the libvirt.so already, so might just need a few things added to the export list ? Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Mon, 2018-04-30 at 10:59 +0100, Daniel P. Berrangé wrote:
On Mon, Apr 30, 2018 at 11:47:33AM +0200, Andrea Bolognani wrote:
Mocking canonicalize_file_name() causes a linking error:
../gnulib/lib/.libs/libgnu.a(canonicalize-lgpl.o): In function `canonicalize_file_name': .../libvirt/gnulib/lib/canonicalize-lgpl.c:417: multiple definition of `canonicalize_file_name' .libs/virpcimock.o:.../libvirt/tests/virpcimock.c:983: first defined here
This is not a problem on Linux, where canonicalize_file_name() is provided by libc, but FreeBSD is using the gnulib implementation instead, leading to the issue above.
AFAIK, the only way is to not link virpcimock.la to gnulib.
If we're lucky all the functions it needs would be present in the libvirt.so already, so might just need a few things added to the export list ?
That compiles fine, but fails at runtime with $ ./tests/qemumemlocktest Missing symbol 'canonicalize_file_name' Abort trap (core dumped) I've tried a different approach: getting rid of the problematic function altogether. Patches are on the list. -- Andrea Bolognani / Red Hat / Virtualization

When hostdevs are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemuxml2xmltest.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 4b5aa2315e..e3c1386f58 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -600,6 +600,8 @@ mymain(void) DO_TEST("pseries-many-buses-2", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); + +# ifdef __linux__ DO_TEST("pseries-hostdevs-1", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI, @@ -612,6 +614,7 @@ mymain(void) QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DEVICE_VFIO_PCI); +# endif /* __linux__ */ DO_TEST("pseries-features", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, -- 2.14.3

When hostdevs and host NUMA nodes are involved, libvirt needs to poke into sysfs to collect some information about them; since that pseudo-filesystem doesn't exist on platforms other than Linux, the corresponding tests would fail and need to be compiled out. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemuxml2argvtest.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5b3bd4a996..343b1a93b7 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -926,6 +926,8 @@ mymain(void) DO_TEST("pmu-feature-off", NONE); DO_TEST("hugepages", NONE); + +# ifdef __linux__ DO_TEST("hugepages-numa", QEMU_CAPS_PIIX_DISABLE_S3, QEMU_CAPS_PIIX_DISABLE_S4, QEMU_CAPS_VIRTIO_SCSI, @@ -935,6 +937,8 @@ mymain(void) QEMU_CAPS_HDA_DUPLEX, QEMU_CAPS_USB_REDIR, QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_OBJECT_MEMORY_FILE); +# endif /* __linux__ */ + DO_TEST_LINUX("hugepages-pages", QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); @@ -950,6 +954,8 @@ mymain(void) QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); DO_TEST("hugepages-pages5", NONE); DO_TEST("hugepages-pages6", NONE); + +# ifdef __linux__ DO_TEST("hugepages-pages7", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_OBJECT_MEMORY_FILE); DO_TEST("hugepages-memaccess", QEMU_CAPS_OBJECT_MEMORY_FILE, @@ -958,6 +964,8 @@ mymain(void) DO_TEST("hugepages-memaccess2", QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA); +# endif /* __linux __ */ + DO_TEST_FAILURE("hugepages-memaccess3", QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_VIRTIO_SCSI); @@ -1673,8 +1681,12 @@ mymain(void) DO_TEST("numatune-distances", QEMU_CAPS_NUMA, QEMU_CAPS_NUMA_DIST); DO_TEST("numatune-auto-nodeset-invalid", NONE); + +# ifdef __linux__ DO_TEST("numatune-auto-prefer", QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); +# endif /* __linux__ */ + DO_TEST_FAILURE("numatune-static-nodeset-exceed-hostnode", QEMU_CAPS_OBJECT_MEMORY_RAM); DO_TEST_PARSE_ERROR("numatune-memnode-nocpu", NONE); @@ -1781,11 +1793,15 @@ mymain(void) QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE); DO_TEST("pseries-phb-default-missing", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE); + +# ifdef __linux__ DO_TEST("pseries-phb-numa-node", QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_SPAPR_PCI_HOST_BRIDGE_NUMA_NODE); +# endif /* __linux __ */ + DO_TEST_PARSE_ERROR("pseries-default-phb-numa-node", NONE); DO_TEST_PARSE_ERROR("pseries-phb-invalid-target-index-1", NONE); DO_TEST_PARSE_ERROR("pseries-phb-invalid-target-index-2", NONE); @@ -1800,6 +1816,8 @@ mymain(void) DO_TEST("pseries-many-buses-2", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); + +# ifdef __linux__ DO_TEST("pseries-hostdevs-1", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI, @@ -1812,6 +1830,7 @@ mymain(void) QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_DEVICE_VFIO_PCI); +# endif /* __linux__ */ DO_TEST("pseries-features", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, @@ -2563,10 +2582,14 @@ mymain(void) DO_TEST_FAILURE("memory-hotplug-nonuma", QEMU_CAPS_DEVICE_PC_DIMM); DO_TEST("memory-hotplug", NONE); DO_TEST("memory-hotplug", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA); + +# ifdef __linux__ DO_TEST("memory-hotplug-dimm", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); DO_TEST("memory-hotplug-dimm-addr", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); +# endif /* __linux__ */ + DO_TEST("memory-hotplug-ppc64-nonuma", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); -- 2.14.3
participants (2)
-
Andrea Bolognani
-
Daniel P. Berrangé