]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
node_device: mdev vfio-ccw support
authorBoris Fiuczynski <fiuczy@linux.ibm.com>
Mon, 14 Sep 2020 19:11:47 +0000 (21:11 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 15 Sep 2020 07:06:32 +0000 (09:06 +0200)
Allow vfio-ccw mdev devices to be created besides vfio-pci mdev devices
as well.

Reviewed-by: Erik Skultety <eskultet@redhat.com>
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
src/conf/domain_addr.c
src/conf/domain_addr.h
src/libvirt_private.syms
src/node_device/node_device_driver.c

index 1068cbf1d28226d047493525da69afe983c78849..1bfa164a4785eb2ecb5b204db5712e47cdfdd355 100644 (file)
@@ -1365,7 +1365,7 @@ virDomainPCIAddressSetAllMulti(virDomainDefPtr def)
 }
 
 
-static char*
+char*
 virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr)
 {
     return g_strdup_printf("%x.%x.%04x", addr->cssid, addr->ssid, addr->devno);
index c1363c1490995d6217c4dd2b57d90a256451cd6b..a0460b4030dcd96844af827aee5dbc13b471ae02 100644 (file)
@@ -208,6 +208,9 @@ int virDomainCCWAddressAssign(virDomainDeviceInfoPtr dev,
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 void virDomainCCWAddressSetFree(virDomainCCWAddressSetPtr addrs);
 
+char* virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr)
+    ATTRIBUTE_NONNULL(1);
+
 virDomainCCWAddressSetPtr
 virDomainCCWAddressSetCreateFromDomain(virDomainDefPtr def)
     ATTRIBUTE_NONNULL(1);
index 5f1aea36946f676a33b1d0ad61059a79cb941e23..5842b8d23d7430efa5d4713e15d341ea6d311204 100644 (file)
@@ -143,6 +143,7 @@ virPCIDeviceAddressParseXML;
 
 # conf/domain_addr.h
 virDomainCCWAddressAssign;
+virDomainCCWAddressAsString;
 virDomainCCWAddressSetCreateFromDomain;
 virDomainCCWAddressSetFree;
 virDomainPCIAddressBusIsFullyReserved;
index e89c8b0ee5e5099b5da821d3958ee46cd26dfff5..375c1fff3247d4729bbeff2c6cf64a2b0904e17a 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "virerror.h"
 #include "datatypes.h"
+#include "domain_addr.h"
 #include "viralloc.h"
 #include "virfile.h"
 #include "virjson.h"
@@ -628,7 +629,7 @@ nodeDeviceFindAddressByName(const char *name)
 {
     virNodeDeviceDefPtr def = NULL;
     virNodeDevCapsDefPtr caps = NULL;
-    char *pci_addr = NULL;
+    char *addr = NULL;
     virNodeDeviceObjPtr dev = virNodeDeviceObjListFindByName(driver->devs, name);
 
     if (!dev) {
@@ -640,21 +641,30 @@ nodeDeviceFindAddressByName(const char *name)
     def = virNodeDeviceObjGetDef(dev);
     for (caps = def->caps; caps != NULL; caps = caps->next) {
         if (caps->data.type == VIR_NODE_DEV_CAP_PCI_DEV) {
-            virPCIDeviceAddress addr = {
+            virPCIDeviceAddress pci_addr = {
                 .domain = caps->data.pci_dev.domain,
                 .bus = caps->data.pci_dev.bus,
                 .slot = caps->data.pci_dev.slot,
                 .function = caps->data.pci_dev.function
             };
 
-            pci_addr = virPCIDeviceAddressAsString(&addr);
+            addr = virPCIDeviceAddressAsString(&pci_addr);
+            break;
+        } else if (caps->data.type == VIR_NODE_DEV_CAP_CSS_DEV) {
+            virDomainDeviceCCWAddress ccw_addr = {
+                .cssid = caps->data.ccw_dev.cssid,
+                .ssid = caps->data.ccw_dev.ssid,
+                .devno = caps->data.ccw_dev.devno
+            };
+
+            addr = virDomainCCWAddressAsString(&ccw_addr);
             break;
         }
     }
 
     virNodeDeviceObjEndAPI(&dev);
 
-    return pci_addr;
+    return addr;
 }
 
 
@@ -664,11 +674,11 @@ nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
 {
     virCommandPtr cmd;
     g_autofree char *json = NULL;
-    g_autofree char *parent_pci = nodeDeviceFindAddressByName(def->parent);
+    g_autofree char *parent_addr = nodeDeviceFindAddressByName(def->parent);
 
-    if (!parent_pci) {
+    if (!parent_addr) {
         virReportError(VIR_ERR_NO_NODE_DEVICE,
-                       _("unable to find PCI address for parent device '%s'"), def->parent);
+                       _("unable to find parent device '%s'"), def->parent);
         return NULL;
     }
 
@@ -679,7 +689,7 @@ nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
     }
 
     cmd = virCommandNewArgList(MDEVCTL, "start",
-                               "-p", parent_pci,
+                               "-p", parent_addr,
                                "--jsonfile", "/dev/stdin",
                                NULL);