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

First two patches just prepare the ground for the third one that explains what needs to be fixed and ho it's done. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1162947 Martin Kletzander (3): conf: Pass private data to Parse function of XML options qemu: Keep numad hint after reboot qemu: Return true pining info when using numad 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 | 33 ++++++++++++++++++++++++++++++++- src/qemu/qemu_driver.c | 11 +++++++++++ 6 files changed, 57 insertions(+), 12 deletions(-) -- 2.4.6

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 73ac5374fd8b..ef7d31d972f4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16339,7 +16339,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 0fe6b1a47c8f..b816346174aa 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2357,14 +2357,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, @@ -2393,6 +2385,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 8b050a043995..5bc033f908a1 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.4.6

Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 5bc033f908a1..27c701e2251d 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; int n; size_t i; xmlNodePtr *nodes = NULL; virQEMUCapsPtr qemuCaps = NULL; + virCapsPtr caps = NULL; if (VIR_ALLOC(priv->monConfig) < 0) goto error; @@ -804,15 +816,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) < 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; } -- 2.4.6

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 40c882c4ba88..1e090bb5c36b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5224,6 +5224,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); @@ -5244,6 +5245,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, goto cleanup; virBitmapSetAll(allcpumap); + priv = vm->privateData; /* Clamp to actual number of vcpus */ if (ncpumaps > def->vcpus) @@ -5262,6 +5264,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; @@ -5412,6 +5417,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); @@ -5428,10 +5434,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.4.6

$SUBJ s/pining/pinning Or perhaps - "qemu: Use numad information when getting pin information"" On 07/26/2015 12:57 PM, Martin Kletzander wrote:
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(+)
Should qemuDomainGetIOThreadsConfig be adjusted as well? In the for loop that's fetching/filling in the iothreadid there's a filling of the cpumask as well. Patches seem reasonable otherwise, although patch2 could have a wee bit more information in the commit log to explain what's being done... Beyond that does that value matter if placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO? or if !virDomainDefNeedsPlacementAdvice (from qemuProcessStart)? Was checking where it was set and if it's set to something reasonable... John
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 40c882c4ba88..1e090bb5c36b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5224,6 +5224,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); @@ -5244,6 +5245,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, goto cleanup;
virBitmapSetAll(allcpumap); + priv = vm->privateData;
/* Clamp to actual number of vcpus */ if (ncpumaps > def->vcpus) @@ -5262,6 +5264,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;
@@ -5412,6 +5417,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); @@ -5428,10 +5434,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;

On Tue, Aug 04, 2015 at 09:27:13PM -0400, John Ferlan wrote:
$SUBJ
s/pining/pinning
Or perhaps - "qemu: Use numad information when getting pin information""
OK, I won't mention anything pine-cone-related then ;)
On 07/26/2015 12:57 PM, Martin Kletzander wrote:
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(+)
Should qemuDomainGetIOThreadsConfig be adjusted as well? In the for loop that's fetching/filling in the iothreadid there's a filling of the cpumask as well.
From the name I think that rather qemuDomainGetIOThreadsLive() should be adjusted, not Config(), unless I misunderstood what they do.
Patches seem reasonable otherwise, although patch2 could have a wee bit more information in the commit log to explain what's being done...
OK, I'll add some info in there.
Beyond that does that value matter if placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO? or if !virDomainDefNeedsPlacementAdvice (from qemuProcessStart)? Was checking where it was set and if it's set to something reasonable...
No it doesn't. Is there a problem with that? I haven't found any.
John
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 40c882c4ba88..1e090bb5c36b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5224,6 +5224,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); @@ -5244,6 +5245,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, goto cleanup;
virBitmapSetAll(allcpumap); + priv = vm->privateData;
/* Clamp to actual number of vcpus */ if (ncpumaps > def->vcpus) @@ -5262,6 +5264,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;
@@ -5412,6 +5417,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); @@ -5428,10 +5434,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;

On 08/07/2015 06:44 AM, Martin Kletzander wrote:
On Tue, Aug 04, 2015 at 09:27:13PM -0400, John Ferlan wrote:
$SUBJ
s/pining/pinning
Or perhaps - "qemu: Use numad information when getting pin information""
OK, I won't mention anything pine-cone-related then ;)
On 07/26/2015 12:57 PM, Martin Kletzander wrote:
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(+)
Should qemuDomainGetIOThreadsConfig be adjusted as well? In the for loop that's fetching/filling in the iothreadid there's a filling of the cpumask as well.
From the name I think that rather qemuDomainGetIOThreadsLive() should be adjusted, not Config(), unless I misunderstood what they do.
The Live function takes whatever bitmap was used to set using GetAffinity. It can be initially set from autoCpuset in hotplug or qemuProcessStart (return from qemuSetupCgroupForIOThreads). So I think Live is fine. The "Config" though would need adjustment. For the Emulator/Vcpu code LIVE/CONFIG is a bit different since it combines live/config...
Patches seem reasonable otherwise, although patch2 could have a wee bit more information in the commit log to explain what's being done...
OK, I'll add some info in there.
Beyond that does that value matter if placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO? or if !virDomainDefNeedsPlacementAdvice (from qemuProcessStart)? Was checking where it was set and if it's set to something reasonable...
No it doesn't. Is there a problem with that? I haven't found any.
IIRC - when I was looking at how/where autoCpuset was initialized - it was only done so in qemuProcessStart, but I think my thought was around whether there was a chance if placement_mode could be AUTO and autoCpuset not be properly initialized. In hindsight and after more looking it doesn't seem possible; however, I do note that the NeedsPlacementAdvice can return true for more than one reason. So now I'm wondering - should any of those checks that only check placement_mode == AUTO - should they change to using virDomainDefNeedsPlacementAdvice? John

On Fri, Aug 07, 2015 at 09:14:29AM -0400, John Ferlan wrote:
On 08/07/2015 06:44 AM, Martin Kletzander wrote:
On Tue, Aug 04, 2015 at 09:27:13PM -0400, John Ferlan wrote:
$SUBJ
s/pining/pinning
Or perhaps - "qemu: Use numad information when getting pin information""
OK, I won't mention anything pine-cone-related then ;)
On 07/26/2015 12:57 PM, Martin Kletzander wrote:
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(+)
Should qemuDomainGetIOThreadsConfig be adjusted as well? In the for loop that's fetching/filling in the iothreadid there's a filling of the cpumask as well.
From the name I think that rather qemuDomainGetIOThreadsLive() should be adjusted, not Config(), unless I misunderstood what they do.
The Live function takes whatever bitmap was used to set using GetAffinity. It can be initially set from autoCpuset in hotplug or qemuProcessStart (return from qemuSetupCgroupForIOThreads). So I think Live is fine. The "Config" though would need adjustment.
So, GetIOThreadsLive does GetAffinity, similarly to how the others did it some time back. But GetIOThreadsConfig cannot work with autoCpuset anyhow. That's initialized when the domain is being started. There is no numad hint when the domain is shut off (or in its permanent definition).
For the Emulator/Vcpu code LIVE/CONFIG is a bit different since it combines live/config...
Patches seem reasonable otherwise, although patch2 could have a wee bit more information in the commit log to explain what's being done...
OK, I'll add some info in there.
Beyond that does that value matter if placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO? or if !virDomainDefNeedsPlacementAdvice (from qemuProcessStart)? Was checking where it was set and if it's set to something reasonable...
No it doesn't. Is there a problem with that? I haven't found any.
IIRC - when I was looking at how/where autoCpuset was initialized - it was only done so in qemuProcessStart, but I think my thought was around whether there was a chance if placement_mode could be AUTO and autoCpuset not be properly initialized. In hindsight and after more looking it doesn't seem possible; however, I do note that the NeedsPlacementAdvice can return true for more than one reason. So now I'm wondering - should any of those checks that only check placement_mode == AUTO - should they change to using virDomainDefNeedsPlacementAdvice?
Well, no. virDomainDefNeedsPlacementAdvice() just tells us whether we need to run numad to get an advice, at all (like if _any_ part of the configuration uses automatic placement). But in these getters we need to return it only if it was used for pinning the threads. Martin

On Sun, Jul 26, 2015 at 06:57:03PM +0200, Martin Kletzander wrote:
First two patches just prepare the ground for the third one that explains what needs to be fixed and ho it's done.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1162947
Post-release ping
Martin Kletzander (3): conf: Pass private data to Parse function of XML options qemu: Keep numad hint after reboot qemu: Return true pining info when using numad
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 | 33 ++++++++++++++++++++++++++++++++- src/qemu/qemu_driver.c | 11 +++++++++++ 6 files changed, 57 insertions(+), 12 deletions(-)
-- 2.4.6
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
participants (2)
-
John Ferlan
-
Martin Kletzander