Implement QEMU command line generation for the ACPI EGM memory device.
This includes:

- Adding the device to the QEMU command line
- Setting up memory backend properties
- Configuring device parameters (alias, PCI device, NUMA node)

Signed-off-by: Ian May <i...@nvidia.com>
---
 src/qemu/qemu_command.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 4b1e36a4c1..280211fbf7 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1011,6 +1011,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef 
*device,
         case VIR_DOMAIN_DEVICE_IOMMU:
         case VIR_DOMAIN_DEVICE_AUDIO:
         case VIR_DOMAIN_DEVICE_PSTORE:
+        case VIR_DOMAIN_DEVICE_EGM:
         case VIR_DOMAIN_DEVICE_LAST:
         default:
             break;
@@ -3451,6 +3452,8 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
         } else if (useHugepage) {
             if (qemuGetDomainHupageMemPath(priv->driver, def, pagesize, 
&memPath) < 0)
                 return -1;
+        } else if (def->egm) {
+            memPath = g_strdup_printf("/dev/%s", def->egm->alias);
         } else {
             /* We can have both pagesize and mem source. If that's the case,
              * prefer hugepages as those are more specific. */
@@ -10533,6 +10536,36 @@ qemuBuildPstoreCommandLine(virCommand *cmd,
     return 0;
 }
 
+static int
+qemuBuildAcpiEgmCommandLine(virCommand *cmd,
+                           virDomainAcpiEgmDef *egm,
+                           virQEMUCaps *qemuCaps)
+{
+    g_autoptr(virJSONValue) egmProps = NULL;
+
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ACPI_EGM_MEMORY)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                      _("ACPI EGM memory device is not supported with this 
QEMU binary"));
+        return -1;
+    }
+
+    VIR_DEBUG("Creating ACPI EGM device: alias=%s, pciDev=%s, numaNode=%d",
+              egm->alias, egm->pciDev, egm->numaNode);
+
+    if (qemuMonitorCreateObjectProps(&egmProps,
+                                    "acpi-egm-memory",
+                                    egm->alias,
+                                    "s:pci-dev", egm->pciDev,
+                                    "u:node", egm->numaNode,
+                                    NULL) < 0) {
+        return -1;
+    }
+
+    if (qemuBuildObjectCommandlineFromJSON(cmd, egmProps) < 0)
+        return -1;
+
+    return 0;
+}
 
 static int
 qemuBuildAsyncTeardownCommandLine(virCommand *cmd,
@@ -10887,6 +10920,10 @@ qemuBuildCommandLine(virDomainObj *vm,
         qemuBuildPstoreCommandLine(cmd, def, def->pstore, qemuCaps) < 0)
         return NULL;
 
+    if (def->egm &&
+        qemuBuildAcpiEgmCommandLine(cmd, def->egm, qemuCaps) < 0)
+        return NULL;
+
     if (qemuBuildAsyncTeardownCommandLine(cmd, def, qemuCaps) < 0)
         return NULL;
 
-- 
2.43.0

Reply via email to