[libvirt] [PATCH v3 0/4] qemu: Return true pinning info

v3: - Added test for the hint keeping patch - Fixed pre-existing crasher found thanks to the test (PATCH 1/4) - Fixed problem in the parsing function found by the test added: - Use nnumaCel_max instead of nnumaCells - Fill in nnumaCell_max in test capabilities v2: - Added more info to commit message of patch 2/3 - Changed the commit subject of patch 3/3 Martin Kletzander (4): qemu: Fix segfault when parsing private domain data conf: Pass private data to Parse function of XML options qemu: Keep numad hint after reboot qemu: Use numad information when getting pin information src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 17 +++++++++-------- src/libxl/libxl_domain.c | 3 ++- src/lxc/lxc_domain.c | 3 ++- src/qemu/qemu_domain.c | 36 ++++++++++++++++++++++++++++++++++-- src/qemu/qemu_driver.c | 11 +++++++++++ tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 8 files changed, 63 insertions(+), 14 deletions(-) -- 2.5.0

When parsing private domain data, there are two paths that are flawed. They are both error paths, just from different parts of the function. One of them can call free() on an uninitialized pointer. Initialization to NULL is enough here. The other one is a bit trickier to explain, but as easy as the first one to fix. We create capabilities, parse them and then assign them into the private data pointer inside the domain object. If, however, we get to fail from now on, the error path calls unrefs the capabilities and then, when the domain object is being cleaned, qemuDomainObjPrivateFree() tries to unref them as well. That causes a segfault. Settin the pointer to NULL upon successful addition to the private data is enough. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index abf52c9c38fa..8fe7c75d19c9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -627,7 +627,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, { qemuDomainObjPrivatePtr priv = vm->privateData; char *monitorpath; - char *tmp; + char *tmp = NULL; int n; size_t i; xmlNodePtr *nodes = NULL; @@ -715,6 +715,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } priv->qemuCaps = qemuCaps; + qemuCaps = NULL; } VIR_FREE(nodes); -- 2.5.0

On 08/13/2015 04:18 AM, Martin Kletzander wrote:
When parsing private domain data, there are two paths that are flawed. They are both error paths, just from different parts of the function. One of them can call free() on an uninitialized pointer. Initialization to NULL is enough here. The other one is a bit trickier to explain, but as easy as the first one to fix. We create capabilities, parse them and then assign them into the private data pointer inside the domain object. If, however, we get to fail from now on, the error path calls unrefs the capabilities and then, when the domain object is being cleaned, qemuDomainObjPrivateFree() tries to unref them as well. That causes a segfault. Settin the pointer to NULL upon successful addition to the
s/Settin/Setting
private data is enough.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Could have been 2 patches though to fix 2 different bugs... Good catch on the second one - that was well hidden... John (and I see Jan's ACK'd the whole series - so whether this gets to you in time or not relies on the speed of email)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index abf52c9c38fa..8fe7c75d19c9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -627,7 +627,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, { qemuDomainObjPrivatePtr priv = vm->privateData; char *monitorpath; - char *tmp; + char *tmp = NULL; int n; size_t i; xmlNodePtr *nodes = NULL; @@ -715,6 +715,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, }
priv->qemuCaps = qemuCaps; + qemuCaps = NULL; } VIR_FREE(nodes);

On Thu, Aug 13, 2015 at 09:04:52AM -0400, John Ferlan wrote:
On 08/13/2015 04:18 AM, Martin Kletzander wrote:
When parsing private domain data, there are two paths that are flawed. They are both error paths, just from different parts of the function. One of them can call free() on an uninitialized pointer. Initialization to NULL is enough here. The other one is a bit trickier to explain, but as easy as the first one to fix. We create capabilities, parse them and then assign them into the private data pointer inside the domain object. If, however, we get to fail from now on, the error path calls unrefs the capabilities and then, when the domain object is being cleaned, qemuDomainObjPrivateFree() tries to unref them as well. That causes a segfault. Settin the pointer to NULL upon successful addition to the
s/Settin/Setting
private data is enough.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Could have been 2 patches though to fix 2 different bugs...
Good catch on the second one - that was well hidden...
John
(and I see Jan's ACK'd the whole series - so whether this gets to you in time or not relies on the speed of email)
And the period I have set for retrieving emails. Sorry, I just pushed it. I though some would hate that I'm sending two lines as two commits, but I have no problem splitting even these next time :)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index abf52c9c38fa..8fe7c75d19c9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -627,7 +627,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, { qemuDomainObjPrivatePtr priv = vm->privateData; char *monitorpath; - char *tmp; + char *tmp = NULL; int n; size_t i; xmlNodePtr *nodes = NULL; @@ -715,6 +715,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, }
priv->qemuCaps = qemuCaps; + qemuCaps = NULL; } VIR_FREE(nodes);

This needs a reorder of XML option definitions. It might come in handy one day. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 17 +++++++++-------- src/libxl/libxl_domain.c | 3 ++- src/lxc/lxc_domain.c | 3 ++- src/qemu/qemu_domain.c | 3 ++- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f1e02e3391d4..0425b9061e30 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16514,7 +16514,7 @@ virDomainObjParseXML(xmlDocPtr xml, VIR_FREE(nodes); if (xmlopt->privateData.parse && - xmlopt->privateData.parse(ctxt, obj) < 0) + xmlopt->privateData.parse(ctxt, obj, &xmlopt->config) < 0) goto error; return obj; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9762c4f27698..daa475dfcc71 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2391,14 +2391,6 @@ typedef bool (*virDomainObjListACLFilter)(virConnectPtr conn, typedef struct _virDomainXMLOption virDomainXMLOption; typedef virDomainXMLOption *virDomainXMLOptionPtr; -typedef void *(*virDomainXMLPrivateDataAllocFunc)(void); -typedef void (*virDomainXMLPrivateDataFreeFunc)(void *); -typedef virObjectPtr (*virDomainXMLPrivateDataNewFunc)(void); -typedef int (*virDomainXMLPrivateDataFormatFunc)(virBufferPtr, - virDomainObjPtr); -typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, - virDomainObjPtr); - /* Called once after everything else has been parsed, for adjusting * overall domain defaults. */ typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def, @@ -2427,6 +2419,15 @@ struct _virDomainDefParserConfig { unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN]; }; +typedef void *(*virDomainXMLPrivateDataAllocFunc)(void); +typedef void (*virDomainXMLPrivateDataFreeFunc)(void *); +typedef virObjectPtr (*virDomainXMLPrivateDataNewFunc)(void); +typedef int (*virDomainXMLPrivateDataFormatFunc)(virBufferPtr, + virDomainObjPtr); +typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, + virDomainObjPtr, + virDomainDefParserConfigPtr); + typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallbacks; typedef virDomainXMLPrivateDataCallbacks *virDomainXMLPrivateDataCallbacksPtr; struct _virDomainXMLPrivateDataCallbacks { diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 224ff773f938..40dcea171c06 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -224,7 +224,8 @@ libxlDomainObjPrivateFree(void *data) static int libxlDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, - virDomainObjPtr vm) + virDomainObjPtr vm, + virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED) { libxlDomainObjPrivatePtr priv = vm->privateData; diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index 70606f376583..2f377d8dcba3 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -65,7 +65,8 @@ virLXCDomainObjPrivateXMLFormat(virBufferPtr buf, static int virLXCDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, - virDomainObjPtr vm) + virDomainObjPtr vm, + virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED) { virLXCDomainObjPrivatePtr priv = vm->privateData; unsigned long long thepid; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8fe7c75d19c9..74560a4f0144 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -623,7 +623,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, - virDomainObjPtr vm) + virDomainObjPtr vm, + virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED) { qemuDomainObjPrivatePtr priv = vm->privateData; char *monitorpath; -- 2.5.0

The numad hint stored in priv->autoNodeset is information that gets lost during daemon restart. And because we would like to use that information in the future, we also need to save it in the status XML. For the sake of tests, we need to initialize nnumaCell_max to some value, so that the restoration doesn't fail in our test suite. There is no need to fill in the actual numa cell data since the recalculating function virCapabilitiesGetCpusForNodemask() will not fail, it will just skip filling the data in the bitmap which we don't use in tests anyway. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++- tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 74560a4f0144..84e5fa530cba 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -618,21 +618,33 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, virBufferAddLit(buf, "</devices>\n"); } + if (priv->autoNodeset) { + char *nodeset = virBitmapFormat(priv->autoNodeset); + + if (!nodeset) + return -1; + + virBufferAsprintf(buf, "<numad nodeset='%s'/>\n", nodeset); + VIR_FREE(nodeset); + } + return 0; } static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, virDomainObjPtr vm, - virDomainDefParserConfigPtr config ATTRIBUTE_UNUSED) + virDomainDefParserConfigPtr config) { qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverPtr driver = config->priv; char *monitorpath; char *tmp = NULL; int n; size_t i; xmlNodePtr *nodes = NULL; virQEMUCapsPtr qemuCaps = NULL; + virCapsPtr caps = NULL; if (VIR_ALLOC(priv->monConfig) < 0) goto error; @@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); + if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto error; + + if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) { + if (virBitmapParse(tmp, 0, &priv->autoNodeset, + caps->host.nnumaCell_max) < 0) + goto error; + + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, + priv->autoNodeset))) + goto error; + } + virObjectUnref(caps); + caps = NULL; + VIR_FREE(tmp); + return 0; error: virDomainChrSourceDefFree(priv->monConfig); priv->monConfig = NULL; VIR_FREE(nodes); + VIR_FREE(tmp); virStringFreeList(priv->qemuDevices); priv->qemuDevices = NULL; virObjectUnref(qemuCaps); + virObjectUnref(caps); return -1; } diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 08923faa8458..5c1c2e9b8656 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -130,7 +130,8 @@ static const char testStatusXMLPrefix[] = " <device alias='serial0'/>\n" " <device alias='net0'/>\n" " <device alias='usb'/>\n" -" </devices>\n"; +" </devices>\n" +" <numad nodeset='0-2'/>\n"; static const char testStatusXMLSuffix[] = "</domstatus>\n"; diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index ceaabb6a240a..a2f429909a75 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -336,6 +336,8 @@ virCapsPtr testQemuCapsInit(void) caps->host.cpu = cpuDefault; + caps->host.nnumaCell_max = 4; + if ((machines = testQemuAllocMachines(&nmachines)) == NULL) goto cleanup; -- 2.5.0

s/reboot/daemon restart/ ? On Thu, Aug 13, 2015 at 10:18:33AM +0200, Martin Kletzander wrote:
The numad hint stored in priv->autoNodeset is information that gets lost during daemon restart. And because we would like to use that information in the future, we also need to save it in the status XML. For the sake of tests, we need to initialize nnumaCell_max to some value, so that the restoration doesn't fail in our test suite. There is no need to fill in the actual numa cell data since the recalculating function virCapabilitiesGetCpusForNodemask() will not fail, it will just skip filling the data in the bitmap which we don't use in tests anyway.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++- tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-)
@@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } VIR_FREE(nodes);
+ if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto error; + + if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) { + if (virBitmapParse(tmp, 0, &priv->autoNodeset, + caps->host.nnumaCell_max) < 0) + goto error; + + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, + priv->autoNodeset))) + goto error; + } + virObjectUnref(caps); + caps = NULL;
This assignment seems redundant. Jan
+ VIR_FREE(tmp); + return 0;

On Thu, Aug 13, 2015 at 02:49:34PM +0200, Ján Tomko wrote:
s/reboot/daemon restart/ ?
Yes, exactly!
On Thu, Aug 13, 2015 at 10:18:33AM +0200, Martin Kletzander wrote:
The numad hint stored in priv->autoNodeset is information that gets lost during daemon restart. And because we would like to use that information in the future, we also need to save it in the status XML. For the sake of tests, we need to initialize nnumaCell_max to some value, so that the restoration doesn't fail in our test suite. There is no need to fill in the actual numa cell data since the recalculating function virCapabilitiesGetCpusForNodemask() will not fail, it will just skip filling the data in the bitmap which we don't use in tests anyway.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++- tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-)
@@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } VIR_FREE(nodes);
+ if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto error; + + if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) { + if (virBitmapParse(tmp, 0, &priv->autoNodeset, + caps->host.nnumaCell_max) < 0) + goto error; + + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, + priv->autoNodeset))) + goto error; + } + virObjectUnref(caps); + caps = NULL;
This assignment seems redundant.
I was thinking about the future when someone adds few lines after this and will try to use 'caps'. Feel free to remove it with follow-up trivial patch if you don't like it.
Jan
+ VIR_FREE(tmp); + return 0;

On Thu, Aug 13, 2015 at 03:01:39PM +0200, Martin Kletzander wrote:
On Thu, Aug 13, 2015 at 02:49:34PM +0200, Ján Tomko wrote:
s/reboot/daemon restart/ ?
Yes, exactly!
On Thu, Aug 13, 2015 at 10:18:33AM +0200, Martin Kletzander wrote:
The numad hint stored in priv->autoNodeset is information that gets lost during daemon restart. And because we would like to use that information in the future, we also need to save it in the status XML. For the sake of tests, we need to initialize nnumaCell_max to some value, so that the restoration doesn't fail in our test suite. There is no need to fill in the actual numa cell data since the recalculating function virCapabilitiesGetCpusForNodemask() will not fail, it will just skip filling the data in the bitmap which we don't use in tests anyway.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++- tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-)
@@ -805,15 +817,33 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, } VIR_FREE(nodes);
+ if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto error; + + if ((tmp = virXPathString("string(./numad/@nodeset)", ctxt))) { + if (virBitmapParse(tmp, 0, &priv->autoNodeset, + caps->host.nnumaCell_max) < 0) + goto error; + + if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps, + priv->autoNodeset))) + goto error; + } + virObjectUnref(caps); + caps = NULL;
This assignment seems redundant.
I was thinking about the future when someone adds few lines after this and will try to use 'caps'.
But what if someone tries to use it between the Unref and the NULL assignment?
Feel free to remove it with follow-up trivial patch if you don't like it.
I would not want to rob you of the chance to clean up after yourself. Jan

Pinning information returned for emulatorpin and vcpupin calls is being returned from our data without querying cgroups for some time. However, not all the data were utilized. When automatic placement is used the information is not returned for the calls mentioned above. Since the numad hint in private data is properly saved/restored, we can safely use it to return true information. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1162947 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_driver.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2e445009fbdd..fa655b5a15ba 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5229,6 +5229,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, int ret = -1; int hostcpus, vcpu; virBitmapPtr allcpumap = NULL; + qemuDomainObjPrivatePtr priv = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -5249,6 +5250,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, goto cleanup; virBitmapSetAll(allcpumap); + priv = vm->privateData; /* Clamp to actual number of vcpus */ if (ncpumaps > def->vcpus) @@ -5267,6 +5269,9 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, if (pininfo && pininfo->cpumask) bitmap = pininfo->cpumask; + else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO && + priv->autoCpuset) + bitmap = priv->autoCpuset; else bitmap = allcpumap; @@ -5417,6 +5422,7 @@ qemuDomainGetEmulatorPinInfo(virDomainPtr dom, int hostcpus; virBitmapPtr cpumask = NULL; virBitmapPtr bitmap = NULL; + qemuDomainObjPrivatePtr priv = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -5433,10 +5439,15 @@ qemuDomainGetEmulatorPinInfo(virDomainPtr dom, if ((hostcpus = nodeGetCPUCount(NULL)) < 0) goto cleanup; + priv = vm->privateData; + if (def->cputune.emulatorpin) { cpumask = def->cputune.emulatorpin; } else if (def->cpumask) { cpumask = def->cpumask; + } else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO && + priv->autoCpuset) { + cpumask = priv->autoCpuset; } else { if (!(bitmap = virBitmapNew(hostcpus))) goto cleanup; -- 2.5.0

On Thu, Aug 13, 2015 at 10:18:30AM +0200, Martin Kletzander wrote:
v3: - Added test for the hint keeping patch - Fixed pre-existing crasher found thanks to the test (PATCH 1/4) - Fixed problem in the parsing function found by the test added: - Use nnumaCel_max instead of nnumaCells - Fill in nnumaCell_max in test capabilities
v2: - Added more info to commit message of patch 2/3 - Changed the commit subject of patch 3/3
Martin Kletzander (4): qemu: Fix segfault when parsing private domain data conf: Pass private data to Parse function of XML options qemu: Keep numad hint after reboot qemu: Use numad information when getting pin information
src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 17 +++++++++-------- src/libxl/libxl_domain.c | 3 ++- src/lxc/lxc_domain.c | 3 ++- src/qemu/qemu_domain.c | 36 ++++++++++++++++++++++++++++++++++-- src/qemu/qemu_driver.c | 11 +++++++++++ tests/qemuxml2xmltest.c | 3 ++- tests/testutilsqemu.c | 2 ++ 8 files changed, 63 insertions(+), 14 deletions(-)
ACK series. Jan
participants (3)
-
John Ferlan
-
Ján Tomko
-
Martin Kletzander