[libvirt] [PATCH v2 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 v2: - Added more info to commit message of patch 2/3 - Changed the commit subject of patch 3/3 Martin Kletzander (3): 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 | 33 ++++++++++++++++++++++++++++++++- src/qemu/qemu_driver.c | 11 +++++++++++ 6 files changed, 57 insertions(+), 12 deletions(-) -- 2.5.0

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 fd0450f09b37..8199ac0fe16e 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 ad9a8ac1aaec..d4b4a28d0d0b 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. 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 d4b4a28d0d0b..9666116aa958 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.5.0

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 6998e1205a47..7bc0e38b6ebe 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5228,6 +5228,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); @@ -5248,6 +5249,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, goto cleanup; virBitmapSetAll(allcpumap); + priv = vm->privateData; /* Clamp to actual number of vcpus */ if (ncpumaps > def->vcpus) @@ -5266,6 +5268,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; @@ -5416,6 +5421,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); @@ -5432,10 +5438,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 Tue, Aug 11, 2015 at 02:24:35PM +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
v2: - Added more info to commit message of patch 2/3 - Changed the commit subject of patch 3/3
I added a test for this that found out some problems, mainly pre-existing ones, so v3 is on its way.
Martin Kletzander (3): 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 | 33 ++++++++++++++++++++++++++++++++- src/qemu/qemu_driver.c | 11 +++++++++++ 6 files changed, 57 insertions(+), 12 deletions(-)
-- 2.5.0
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
participants (1)
-
Martin Kletzander