[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 7/7] libxl, Use QMP to insert a passthrough device when using upstream QEMU



Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 tools/libxl/libxl_pci.c |   58 ++++++++++++++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 1523cf0..b6cb4a3 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -613,27 +613,43 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, 
libxl_device_pci *pcidev, i
                                          NULL, NULL, NULL) < 0) {
             return ERROR_FAIL;
         }
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", 
domid);
-        state = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", 
domid);
-        if (pcidev->vdevfn)
-            libxl__xs_write(gc, XBT_NULL, path, PCI_BDF_VDEVFN, pcidev->domain,
-                           pcidev->bus, pcidev->dev, pcidev->func, 
pcidev->vdevfn);
-        else
-            libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
-                           pcidev->bus, pcidev->dev, pcidev->func);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", 
domid);
-        xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins"));
-        rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
-                                          pci_ins_check, state);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", 
domid);
-        vdevfn = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", 
domid);
-        if ( rc < 0 )
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "qemu refused to add device: 
%s", vdevfn);
-        else if ( sscanf(vdevfn, "0x%x", &pcidev->vdevfn) != 1 )
-            rc = -1;
-        xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+        if (libxl__device_model_version_running(gc, domid)
+            == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
+            rc = libxl__qmp_pci_add(gc, domid, pcidev);
+        } else {
+            path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state",
+                                  domid);
+            state = libxl__xs_read(gc, XBT_NULL, path);
+            path = libxl__sprintf(gc,
+                                  "/local/domain/0/device-model/%d/parameter",
+                                  domid);
+            if (pcidev->vdevfn) {
+                libxl__xs_write(gc, XBT_NULL, path, PCI_BDF_VDEVFN,
+                                pcidev->domain, pcidev->bus, pcidev->dev,
+                                pcidev->func, pcidev->vdevfn);
+            } else {
+                libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
+                                pcidev->bus, pcidev->dev, pcidev->func);
+            }
+            path = libxl__sprintf(gc,
+                                  "/local/domain/0/device-model/%d/command",
+                                  domid);
+            xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins"));
+            rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
+                                              pci_ins_check, state);
+            path = libxl__sprintf(gc,
+                                  "/local/domain/0/device-model/%d/parameter",
+                                  domid);
+            vdevfn = libxl__xs_read(gc, XBT_NULL, path);
+            path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state",
+                                  domid);
+            if ( rc < 0 )
+                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                           "qemu refused to add device: %s", vdevfn);
+            else if ( sscanf(vdevfn, "0x%x", &pcidev->vdevfn) != 1 )
+                rc = -1;
+            xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+        }
         if ( rc )
             return ERROR_FAIL;
         break;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.