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 <[email protected]>
---
 docs/formatdomain.rst             | 18 +++++++++++++++++-
 src/conf/domain_conf.c            | 28 ++++++++++++++++++++++++++++
 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, 74 insertions(+), 1 deletion(-)

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 39bdecf9a1..06e3580f37 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -9000,6 +9000,16 @@ Example: usage of the memory devices
          <size unit='KiB'>16384</size>
        </target>
      </memory>
+     <memory model='egm' access='shared'>
+       <source>
+         <path>/dev/egm0</path>
+       </source>
+       <target>
+         <size unit='KiB'>524288</size>
+         <node>0</node>
+         <pciDev>ua-hostdev0</pciDev>
+       </target>
+     </memory>
    </devices>
    ...
 
@@ -9011,7 +9021,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
@@ -9146,6 +9157,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 4737594487..ac97b44b9e 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,
@@ -3608,6 +3609,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;
@@ -14048,6 +14052,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;
@@ -14124,6 +14132,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:
@@ -16183,6 +16195,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;
@@ -22047,6 +22065,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;
@@ -26525,6 +26544,10 @@ virDomainMemorySourceDefFormat(virBuffer *buf,
         }
         break;
 
+    case VIR_DOMAIN_MEMORY_MODEL_EGM:
+        virBufferEscapeString(&childBuf, "<path>%s</path>\n", 
def->source.egm.path);
+        break;
+
     case VIR_DOMAIN_MEMORY_MODEL_NONE:
     case VIR_DOMAIN_MEMORY_MODEL_LAST:
         break;
@@ -26589,6 +26612,11 @@ virDomainMemoryTargetDefFormat(virBuffer *buf,
         }
         break;
 
+    case VIR_DOMAIN_MEMORY_MODEL_EGM:
+        if (def->target.egm.pciDev)
+            virBufferAsprintf(&childBuf, "<pciDev>%s</pciDev>\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 a63d922853..461c855c0b 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2741,6 +2741,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;
@@ -2773,6 +2774,9 @@ struct _virDomainMemoryDef {
         struct {
             virBitmap *nodes; /* source NUMA nodes */
         } sgx_epc;
+        struct {
+            char *path;
+        } egm;
     } source;
 
     union {
@@ -2798,6 +2802,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 93a2bc9b01..8986d8f390 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -2482,6 +2482,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;
@@ -2528,6 +2529,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;
@@ -2708,6 +2710,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 ace74fee08..b2429cf5b4 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -7481,6 +7481,7 @@
           <value>virtio-pmem</value>
           <value>virtio-mem</value>
           <value>sgx-epc</value>
+          <value>egm</value>
         </choice>
       </attribute>
       <optional>
@@ -7607,6 +7608,11 @@
             </attribute>
           </element>
         </optional>
+        <optional>
+          <element name="pciDev">
+            <data type="string"/>
+          </element>
+        </optional>
       </interleave>
     </element>
   </define>
-- 
2.43.0

Reply via email to