From b98596a717ef7cdc0e7b170461aedc1841937228 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 16 Feb 2015 20:34:37 +0100 Subject: [PATCH] conf: numa: Check ABI stability of NUMA configuration Add helper to compare initial sizes of indivitual NUMA nodes and the map of belonging vCPUs. Other configuration is not ABI. --- src/conf/domain_conf.c | 3 +++ src/conf/numa_conf.c | 39 +++++++++++++++++++++++++++++++++++++++ src/conf/numa_conf.h | 3 +++ src/libvirt_private.syms | 1 + 4 files changed, 46 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ccf60213f4..c9fe928124 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -15970,6 +15970,9 @@ virDomainDefCheckABIStability(virDomainDefPtr src, goto error; } + if (!virDomainNumaCheckABIStability(src->numa, dst->numa)) + goto error; + if (src->vcpus != dst->vcpus) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target domain vCPU count %d does not match source %d"), diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 52b9fe9be1..9caa655aca 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -814,6 +814,45 @@ virDomainNumaNew(void) } +bool +virDomainNumaCheckABIStability(virDomainNumaPtr src, + virDomainNumaPtr tgt) +{ + size_t i; + + if (virDomainNumaGetNodeCount(src) != virDomainNumaGetNodeCount(tgt)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target NUMA node count '%zu' doesn't match " + "source '%zu'"), + virDomainNumaGetNodeCount(tgt), + virDomainNumaGetNodeCount(src)); + return false; + } + + for (i = 0; i < virDomainNumaGetNodeCount(src); i++) { + if (virDomainNumaGetNodeMemorySize(src, i) != + virDomainNumaGetNodeMemorySize(tgt, i)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Size of target NUMA node %zu (%llu) doesn't " + "match source (%llu)"), i, + virDomainNumaGetNodeMemorySize(tgt, i), + virDomainNumaGetNodeMemorySize(src, i)); + return false; + } + + if (!virBitmapEqual(virDomainNumaGetNodeCpumask(src, i), + virDomainNumaGetNodeCpumask(tgt, i))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Processor mask of target NUMA node %zu doesn't " + "match source"), i); + return false; + } + } + + return true; +} + + size_t virDomainNumaGetNodeCount(virDomainNumaPtr numa) { diff --git a/src/conf/numa_conf.h b/src/conf/numa_conf.h index 0a0a06e7b7..dc2ce58212 100644 --- a/src/conf/numa_conf.h +++ b/src/conf/numa_conf.h @@ -129,6 +129,9 @@ void virDomainNumaSetNodeMemorySize(virDomainNumaPtr numa, bool virDomainNumaEquals(virDomainNumaPtr n1, virDomainNumaPtr n2); +bool virDomainNumaCheckABIStability(virDomainNumaPtr src, + virDomainNumaPtr tgt); + bool virDomainNumatuneHasPlacementAuto(virDomainNumaPtr numatune); bool virDomainNumatuneHasPerNodeBinding(virDomainNumaPtr numatune); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3bc3f87689..c156b40c53 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -627,6 +627,7 @@ virNodeDeviceObjUnlock; # conf/numa_conf.h +virDomainNumaCheckABIStability; virDomainNumaEquals; virDomainNumaFree; virDomainNumaGetNodeCount; -- GitLab