diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 67d5f958d5..0a4f9d9000 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -8443,6 +8443,19 @@ Example: usage of the memory devices The ``node`` subelement configures the guest NUMA node to attach the memory to. The element shall be used only if the guest has NUMA nodes configured. + For ``virtio-mem`` optional attribute ``dynamicMemslots`` can be specified + (accepted values "yes"/"no") which allows hypervisor to spread memory into + multiple memory slots (allocate them dynamically based on the amount of + memory exposed to the guest), resulting in smaller memory footprint. But be + aware this may affect vhost-user devices. When enabled, older vhost-user + device implementations (such as virtiofs) may refuse to initialize resulting + in failed domain startup or device hotplug. When only modern vhost-user + based devices will be used or when no vhost-user devices are expected to be + used it's beneficial to enable this feature. The current default is + hypervisor dependant (for QEMU is "no"). If the default changes and you are + having difficulties with vhost-user devices, try toggling this to "no". + :since:`Since 10.1.0 and QEMU 8.2.0` + The following optional elements may be used: ``label`` diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 59d51c4c52..fb5a5cc351 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13558,6 +13558,10 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, &def->target.virtio_mem.requestedsize, false, false) < 0) return -1; + if (virXMLPropTristateBool(node, "dynamicMemslots", VIR_XML_PROP_NONE, + &def->target.virtio_mem.dynamicMemslots) < 0) + return -1; + addrNode = virXPathNode("./address", ctxt); addr = &def->target.virtio_mem.address; break; @@ -21232,6 +21236,12 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src, src->target.virtio_mem.address); return false; } + + if (src->target.virtio_mem.dynamicMemslots != dst->target.virtio_mem.dynamicMemslots) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Target memory device 'dynamicMemslots' property doesn't match source memory device")); + return false; + } break; case VIR_DOMAIN_MEMORY_MODEL_DIMM: @@ -25448,6 +25458,7 @@ virDomainMemoryTargetDefFormat(virBuffer *buf, unsigned int flags) { g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); + g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; virBufferAsprintf(&childBuf, "%llu\n", def->size); if (def->targetNode >= 0) @@ -25487,6 +25498,11 @@ virDomainMemoryTargetDefFormat(virBuffer *buf, if (def->target.virtio_mem.address) virBufferAsprintf(&childBuf, "
\n", def->target.virtio_mem.address); + + if (def->target.virtio_mem.dynamicMemslots) { + virBufferAsprintf(&attrBuf, " dynamicMemslots='%s'", + virTristateBoolTypeToString(def->target.virtio_mem.dynamicMemslots)); + } break; case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: @@ -25496,7 +25512,7 @@ virDomainMemoryTargetDefFormat(virBuffer *buf, break; } - virXMLFormatElement(buf, "target", NULL, &childBuf); + virXMLFormatElement(buf, "target", &attrBuf, &childBuf); } static int diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d176bda5f8..bd283d42df 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2676,6 +2676,7 @@ struct _virDomainMemoryDef { unsigned long long currentsize; /* kibibytes, valid for an active domain only and parsed */ unsigned long long address; /* address where memory is mapped */ + virTristateBool dynamicMemslots; } virtio_mem; struct { } sgx_epc; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index a34427c330..df44cd9857 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7268,6 +7268,11 @@ + + + + + diff --git a/tests/qemuxmlconfdata/memory-hotplug-virtio-mem.xml b/tests/qemuxmlconfdata/memory-hotplug-virtio-mem.xml index 52fa6b14e9..20282a131b 100644 --- a/tests/qemuxmlconfdata/memory-hotplug-virtio-mem.xml +++ b/tests/qemuxmlconfdata/memory-hotplug-virtio-mem.xml @@ -60,7 +60,7 @@ 1-3 2048 - + 2097152 0 2048