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;