From 4848c85053e26d89fd30f29319076f6141cd592c Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 27 Oct 2025 11:38:57 +0100 Subject: [PATCH] conf: Introduce virtio options for virtio memory models Both virtio-mem and virtio-pmem memory models are virtio devices and as such support setting various virtio knobs (iommu, ats, packed, page_per_vq) common to other virtio devices. Introduce element as a child to element, just like we do for other virtio devices, where aforementioned knobs live. NB, this is without docs changes, since we do not document which virtio devices support these knobs and each one is already documented. Also, the virtio-options.xml test needed some additional adjustment (apart from adding virtio-mem device) to enable memory hotplug. Signed-off-by: Michal Privoznik Reviewed-by: Jiri Denemark --- src/conf/domain_conf.c | 12 ++++++++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 5 ++++ src/conf/schemas/domaincommon.rng | 5 ++++ .../virtio-options.x86_64-latest.args | 9 +++++--- tests/qemuxmlconfdata/virtio-options.xml | 23 +++++++++++++++++-- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d430101dce..c09f026a1c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14413,6 +14413,10 @@ virDomainMemoryDefParseXML(virDomainXMLOption *xmlopt, &def->info, flags) < 0) return NULL; + if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt), + &def->virtio) < 0) + return NULL; + return g_steal_pointer(&def); } @@ -22073,6 +22077,9 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src, break; } + if (!virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio)) + return false; + return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info); } @@ -26626,6 +26633,7 @@ virDomainMemoryDefFormat(virBuffer *buf, const char *model = virDomainMemoryModelTypeToString(def->model); g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); + g_auto(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; virBufferAsprintf(&attrBuf, " model='%s'", model); if (def->access) @@ -26643,6 +26651,10 @@ virDomainMemoryDefFormat(virBuffer *buf, virBufferAsprintf(&childBuf, "%s\n", uuidstr); } + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); + + virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); + virDomainMemorySourceDefFormat(&childBuf, def); virDomainMemoryTargetDefFormat(&childBuf, def, flags); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a279fdd43c..b265bf224b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2801,6 +2801,7 @@ struct _virDomainMemoryDef { } target; virDomainDeviceInfo info; + virDomainVirtioOptions *virtio; }; virDomainMemoryDef *virDomainMemoryDefNew(virDomainMemoryModel model); diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index eea9b38b21..17955decc0 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2723,6 +2723,11 @@ virDomainMemoryDefValidate(const virDomainMemoryDef *mem, if (virDomainMemoryDefCheckConflict(mem, def) < 0) return -1; + if (!virDomainMemoryIsVirtioModel(mem) && + virDomainCheckVirtioOptionsAreAbsent(mem->virtio) < 0) { + return -1; + } + return 0; } diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index ace74fee08..110f6cbc69 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7502,6 +7502,11 @@ + + + + + diff --git a/tests/qemuxmlconfdata/virtio-options.x86_64-latest.args b/tests/qemuxmlconfdata/virtio-options.x86_64-latest.args index 03b3dd9691..f2b9ee2afe 100644 --- a/tests/qemuxmlconfdata/virtio-options.x86_64-latest.args +++ b/tests/qemuxmlconfdata/virtio-options.x86_64-latest.args @@ -10,13 +10,14 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -name guest=QEMUGuest1,debug-threads=on \ -S \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ --machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-machine pc,usb=off,dump-guest-core=off,acpi=off \ -accel tcg \ -cpu qemu64 \ --m size=219136k \ --object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-m size=2316288k,maxmem=1099511627776k \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":2371878912}' \ +-numa node,nodeid=0,cpus=0,memdev=ram-node0 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ -display none \ -no-user-config \ @@ -29,6 +30,8 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -device '{"driver":"virtio-scsi-pci","iommu_platform":true,"ats":true,"packed":true,"page-per-vq":true,"id":"scsi0","bus":"pci.0","addr":"0x8"}' \ -device '{"driver":"virtio-serial-pci","iommu_platform":true,"ats":true,"packed":true,"page-per-vq":true,"id":"virtio-serial0","bus":"pci.0","addr":"0x9"}' \ +-object '{"qom-type":"memory-backend-file","id":"memvirtiomem0","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","reserve":false,"size":2147483648,"host-nodes":[1,2,3],"policy":"bind"}' \ +-device '{"driver":"virtio-mem-pci","node":0,"block-size":2097152,"requested-size":1073741824,"memdev":"memvirtiomem0","prealloc":true,"memaddr":5637144576,"dynamic-memslots":true,"id":"virtiomem0","bus":"pci.0","addr":"0x5"}' \ -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/img1","node-name":"libvirt-1-storage","read-only":false}' \ -device '{"driver":"virtio-blk-pci","iommu_platform":true,"ats":true,"packed":true,"page-per-vq":true,"bus":"pci.0","addr":"0xa","drive":"libvirt-1-storage","id":"virtio-disk0","bootindex":1}' \ -fsdev local,security_model=passthrough,id=fsdev-fs0,path=/export/fs1 \ diff --git a/tests/qemuxmlconfdata/virtio-options.xml b/tests/qemuxmlconfdata/virtio-options.xml index 486bc453a1..05eaae35a9 100644 --- a/tests/qemuxmlconfdata/virtio-options.xml +++ b/tests/qemuxmlconfdata/virtio-options.xml @@ -1,8 +1,9 @@ QEMUGuest1 c7a5fdbd-edaf-9455-926a-d65c16db1809 - 219136 - 219136 + 1099511627776 + 2316288 + 2316288 1 hvm @@ -10,6 +11,9 @@ qemu64 + + + destroy @@ -92,5 +96,20 @@
+ + + + 1-3 + 2048 + + + 2097152 + 0 + 2048 + 1048576 +
+ +
+ -- 2.47.3