From 8049e03589d633edba613c6775dcd5656d851460 Mon Sep 17 00:00:00 2001 Message-ID: <8049e03589d633edba613c6775dcd5656d851460.1779098642.git.phrdina@redhat.com> From: Pavel Hrdina Date: Tue, 25 Nov 2025 11:17:01 -0800 Subject: [PATCH] conf: Support EGM memory device model From: Nathan Chen via Devel Add support for EGM memory device model with 'path' source attribute and 'pciDev' target attribute to denote host EGM device backing path and PCI device alias to associate the vEGM with, respectively. Signed-off-by: Nathan Chen Resolves: https://redhat.atlassian.net/browse/VOYAGER-13 --- docs/formatdomain.rst | 18 +++++++++++++++++- src/conf/domain_conf.c | 29 +++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++++ src/conf/domain_postparse.c | 1 + src/conf/domain_validate.c | 15 +++++++++++++++ src/conf/schemas/domaincommon.rng | 6 ++++++ 6 files changed, 75 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 44f9b6e197..4fde1534d6 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9119,6 +9119,16 @@ Example: usage of the memory devices 16384 + + + /dev/egm0 + + + 524288 + 0 + ua-hostdev0 + + ... @@ -9130,7 +9140,8 @@ Example: usage of the memory devices persistent memory device. :since:`Since 7.1.0` Provide ``virtio-mem`` model to add paravirtualized memory device. :since:`Since 7.9.0` Provide ``sgx-epc`` model to add a SGX enclave page cache (EPC) memory to the guest. - :since:`Since 8.10.0 and QEMU 7.0.0` + :since:`Since 8.10.0 and QEMU 7.0.0` Provide ``egm`` model to add a EGM + (Extended GPU Memory) device. ``access`` An optional attribute ``access`` ( :since:`since 3.2.0` ) that provides @@ -9265,6 +9276,11 @@ Example: usage of the memory devices The physical address in memory, where device is mapped. :since:`Since 9.4.0` + ``pciDev`` + For ``egm`` only. + The PCI device that is enabled to access the system memory via + association with the EGM device. + IOMMU devices ~~~~~~~~~~~~~ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 06790e0962..038476edd7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1522,6 +1522,7 @@ VIR_ENUM_IMPL(virDomainMemoryModel, "virtio-pmem", "virtio-mem", "sgx-epc", + "egm", ); VIR_ENUM_IMPL(virDomainShmemModel, @@ -3638,6 +3639,9 @@ void virDomainMemoryDefFree(virDomainMemoryDef *def) case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: virBitmapFree(def->source.sgx_epc.nodes); break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + g_free(def->source.egm.path); + g_free(def->target.egm.pciDev); case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -14216,6 +14220,10 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node, } break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + def->source.egm.path = virXPathString("string(./path)", ctxt); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -14292,6 +14300,10 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, addr = &def->target.virtio_pmem.address; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + def->target.egm.pciDev = virXPathString("string(./pciDev)", ctxt); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: @@ -14513,6 +14525,7 @@ virDomainMemoryIsVirtioModel(const virDomainMemoryDef *def) case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; } @@ -16415,6 +16428,12 @@ virDomainMemoryFindByDefInternal(virDomainDef *def, continue; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (STRNEQ(tmp->source.egm.path, mem->source.egm.path)) + continue; + if (STRNEQ(tmp->target.egm.pciDev, mem->target.egm.pciDev)) + continue; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -22430,6 +22449,7 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src, case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -26998,6 +27018,10 @@ virDomainMemorySourceDefFormat(virBuffer *buf, } break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + virBufferEscapeString(&childBuf, "%s\n", def->source.egm.path); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -27060,6 +27084,11 @@ virDomainMemoryTargetDefFormat(virBuffer *buf, } break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (def->target.egm.pciDev) + virBufferAsprintf(&childBuf, "%s\n", def->target.egm.pciDev); + break; + case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NONE: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 06e03deafe..4d03521245 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2755,6 +2755,7 @@ typedef enum { VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM, /* virtio-pmem memory device */ VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM, /* virtio-mem memory device */ VIR_DOMAIN_MEMORY_MODEL_SGX_EPC, /* SGX enclave page cache */ + VIR_DOMAIN_MEMORY_MODEL_EGM, /* Extended GPU memory */ VIR_DOMAIN_MEMORY_MODEL_LAST } virDomainMemoryModel; @@ -2787,6 +2788,9 @@ struct _virDomainMemoryDef { struct { virBitmap *nodes; /* source NUMA nodes */ } sgx_epc; + struct { + char *path; + } egm; } source; union { @@ -2812,6 +2816,9 @@ struct _virDomainMemoryDef { } virtio_mem; struct { } sgx_epc; + struct { + char *pciDev; + } egm; } target; virDomainDeviceInfo info; diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index 38e731348d..0181d21f0e 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -632,6 +632,7 @@ virDomainMemoryDefPostParse(virDomainMemoryDef *mem, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: case VIR_DOMAIN_MEMORY_MODEL_DIMM: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index f243b119a4..34906ddc84 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2525,6 +2525,7 @@ virDomainMemoryDefCheckConflict(const virDomainMemoryDef *mem, } break; case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -2571,6 +2572,7 @@ virDomainMemoryDefCheckConflict(const virDomainMemoryDef *mem, switch (other->model) { case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: continue; break; @@ -2751,6 +2753,19 @@ virDomainMemoryDefValidate(const virDomainMemoryDef *mem, } break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (!mem->source.egm.path) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("path is required for model 'egm'")); + return -1; + } + if (!mem->target.egm.pciDev) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("pciDev is required for model 'egm'")); + return -1; + } + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: default: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 839a144da8..123e4057b7 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7561,6 +7561,7 @@ virtio-pmem virtio-mem sgx-epc + egm @@ -7692,6 +7693,11 @@ + + + + + -- 2.54.0