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"),
}
+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)
{
bool virDomainNumaEquals(virDomainNumaPtr n1,
virDomainNumaPtr n2);
+bool virDomainNumaCheckABIStability(virDomainNumaPtr src,
+ virDomainNumaPtr tgt);
+
bool virDomainNumatuneHasPlacementAuto(virDomainNumaPtr numatune);
bool virDomainNumatuneHasPerNodeBinding(virDomainNumaPtr numatune);