]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
node_device: detect CSS devices
authorBoris Fiuczynski <fiuczy@linux.ibm.com>
Mon, 14 Sep 2020 19:11:44 +0000 (21:11 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 15 Sep 2020 07:06:15 +0000 (09:06 +0200)
Make channel subsystem (CSS) devices available in the node_device driver.
The CCS devices reside in the computer system and provide CCW devices, e.g.:

  +- css_0_0_003a
      |
      +- ccw_0_0_1a2b
          |
          +- scsi_host0
              |
              +- scsi_target0_0_0
                  |
                  +- scsi_0_0_0_0

Reviewed-by: Erik Skultety <eskultet@redhat.com>
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
docs/schemas/nodedev.rng
src/conf/node_device_conf.c
src/conf/node_device_conf.h
src/conf/virnodedeviceobj.c
src/node_device/node_device_udev.c
tests/nodedevschemadata/ccw_0_0_10000-invalid.xml
tests/nodedevschemadata/ccw_0_0_ffff.xml
tests/nodedevschemadata/css_0_0_ffff.xml [new file with mode: 0644]
tests/nodedevxml2xmltest.c
tools/virsh-nodedev.c

index 4b2b350fd8e70e08eb7b2d5d3af74a753d935632..f7f517b5484262b676466b5e924e5ef794e280f6 100644 (file)
@@ -85,6 +85,7 @@
         <ref name="capdrm"/>
         <ref name="capmdev"/>
         <ref name="capccwdev"/>
+        <ref name="capcssdev"/>
       </choice>
     </element>
   </define>
     </element>
   </define>
 
+  <define name='capcssdev'>
+    <attribute name='type'>
+      <value>css</value>
+    </attribute>
+    <element name='cssid'>
+      <ref name='ccwCssidRange'/>
+    </element>
+    <element name='ssid'>
+      <ref name='ccwSsidRange'/>
+    </element>
+    <element name='devno'>
+      <ref name='ccwDevnoRange'/>
+    </element>
+  </define>
+
   <define name='address'>
     <element name='address'>
       <attribute name='domain'><ref name='hexuint'/></attribute>
index f6a91165c9e1b2dafe2d6a85ed5c2b965752ae68..a9a03ad6c22a63ad9c4c7657cf9c59867c509f23 100644 (file)
@@ -65,6 +65,7 @@ VIR_ENUM_IMPL(virNodeDevCap,
               "mdev_types",
               "mdev",
               "ccw",
+              "css",
 );
 
 VIR_ENUM_IMPL(virNodeDevNetCap,
@@ -602,6 +603,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def)
             virNodeDeviceCapMdevDefFormat(&buf, data);
             break;
         case VIR_NODE_DEV_CAP_CCW_DEV:
+        case VIR_NODE_DEV_CAP_CSS_DEV:
             virBufferAsprintf(&buf, "<cssid>0x%x</cssid>\n",
                               data->ccw_dev.cssid);
             virBufferAsprintf(&buf, "<ssid>0x%x</ssid>\n",
@@ -1904,6 +1906,7 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt,
         ret = virNodeDevCapMdevParseXML(ctxt, def, node, &caps->data.mdev);
         break;
     case VIR_NODE_DEV_CAP_CCW_DEV:
+    case VIR_NODE_DEV_CAP_CSS_DEV:
         ret = virNodeDevCapCCWParseXML(ctxt, def, node, &caps->data.ccw_dev);
         break;
     case VIR_NODE_DEV_CAP_MDEV_TYPES:
@@ -2228,6 +2231,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
     case VIR_NODE_DEV_CAP_FC_HOST:
     case VIR_NODE_DEV_CAP_VPORTS:
     case VIR_NODE_DEV_CAP_CCW_DEV:
+    case VIR_NODE_DEV_CAP_CSS_DEV:
     case VIR_NODE_DEV_CAP_LAST:
         /* This case is here to shutup the compiler */
         break;
@@ -2281,6 +2285,7 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def)
         case VIR_NODE_DEV_CAP_MDEV_TYPES:
         case VIR_NODE_DEV_CAP_MDEV:
         case VIR_NODE_DEV_CAP_CCW_DEV:
+        case VIR_NODE_DEV_CAP_CSS_DEV:
         case VIR_NODE_DEV_CAP_LAST:
             break;
         }
index 9b8c7aadea8e189c48ae8a6c4fd6a434c6503e8e..47669d4294d853646e17614b46c2de12f32eab58 100644 (file)
@@ -64,6 +64,7 @@ typedef enum {
     VIR_NODE_DEV_CAP_MDEV_TYPES,        /* Device capable of mediated devices */
     VIR_NODE_DEV_CAP_MDEV,              /* Mediated device */
     VIR_NODE_DEV_CAP_CCW_DEV,           /* s390 CCW device */
+    VIR_NODE_DEV_CAP_CSS_DEV,           /* s390 channel subsystem device */
 
     VIR_NODE_DEV_CAP_LAST
 } virNodeDevCapType;
index bfd524121ca3e78ac332f3ea7489839db2a3dc50..e234432b6f633ba235dd63b7ecd259e1c4644969 100644 (file)
@@ -710,6 +710,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj,
         case VIR_NODE_DEV_CAP_MDEV_TYPES:
         case VIR_NODE_DEV_CAP_MDEV:
         case VIR_NODE_DEV_CAP_CCW_DEV:
+        case VIR_NODE_DEV_CAP_CSS_DEV:
         case VIR_NODE_DEV_CAP_LAST:
             break;
         }
index d478a673fdb6151730e5f81b86c65d8ad2eff1ee..38906f5f96801e19b3fcb1ec2f07a102a6ddc229 100644 (file)
@@ -1097,6 +1097,24 @@ udevProcessCCW(struct udev_device *device,
 }
 
 
+static int
+udevProcessCSS(struct udev_device *device,
+               virNodeDeviceDefPtr def)
+{
+    /* only process IO subchannel and vfio-ccw devices to keep the list sane */
+    if (STRNEQ(def->driver, "io_subchannel") &&
+        STRNEQ(def->driver, "vfio_ccw"))
+        return -1;
+
+    if (udevGetCCWAddress(def->sysfs_path, &def->caps->data) < 0)
+        return -1;
+
+    if (udevGenerateDeviceName(device, def, NULL) != 0)
+        return -1;
+
+    return 0;
+}
+
 static int
 udevGetDeviceNodes(struct udev_device *device,
                    virNodeDeviceDefPtr def)
@@ -1175,6 +1193,8 @@ udevGetDeviceType(struct udev_device *device,
             *type = VIR_NODE_DEV_CAP_MDEV;
         else if (STREQ_NULLABLE(subsystem, "ccw"))
             *type = VIR_NODE_DEV_CAP_CCW_DEV;
+        else if (STREQ_NULLABLE(subsystem, "css"))
+            *type = VIR_NODE_DEV_CAP_CSS_DEV;
 
         VIR_FREE(subsystem);
     }
@@ -1219,6 +1239,8 @@ udevGetDeviceDetails(struct udev_device *device,
         return udevProcessMediatedDevice(device, def);
     case VIR_NODE_DEV_CAP_CCW_DEV:
         return udevProcessCCW(device, def);
+    case VIR_NODE_DEV_CAP_CSS_DEV:
+        return udevProcessCSS(device, def);
     case VIR_NODE_DEV_CAP_MDEV_TYPES:
     case VIR_NODE_DEV_CAP_SYSTEM:
     case VIR_NODE_DEV_CAP_FC_HOST:
index d840555c09b6f86efc27231df6bb2aca53d8e1bd..f3cf0c1c6605e8b91d4d89c98aafcf4e5d0b0803 100644 (file)
@@ -1,7 +1,7 @@
 <device>
   <name>ccw_0_0_10000</name>
-  <path>/sys/devices/css0/0.0.0000/0.0.10000</path>
-  <parent>computer</parent>
+  <path>/sys/devices/css0/0.0.0070/0.0.10000</path>
+  <parent>css_0_0_0070</parent>
   <capability type='ccw'>
     <cssid>0x0</cssid>
     <ssid>0x0</ssid>
index 5ecd0b0aae57f82c058e6a565bb63403e0c5157d..3b8ea46e374935cf4f2e18186d3b74496c91f9d2 100644 (file)
@@ -1,7 +1,7 @@
 <device>
   <name>ccw_0_0_ffff</name>
-  <path>/sys/devices/css0/0.0.0000/0.0.ffff</path>
-  <parent>computer</parent>
+  <path>/sys/devices/css0/0.0.0070/0.0.ffff</path>
+  <parent>css_0_0_0070</parent>
   <capability type='ccw'>
     <cssid>0x0</cssid>
     <ssid>0x0</ssid>
diff --git a/tests/nodedevschemadata/css_0_0_ffff.xml b/tests/nodedevschemadata/css_0_0_ffff.xml
new file mode 100644 (file)
index 0000000..312e07f
--- /dev/null
@@ -0,0 +1,10 @@
+<device>
+  <name>css_0_0_ffff</name>
+  <path>/sys/devices/css0/0.0.ffff</path>
+  <parent>computer</parent>
+  <capability type='css'>
+    <cssid>0x0</cssid>
+    <ssid>0x0</ssid>
+    <devno>0xffff</devno>
+  </capability>
+</device>
index 6168c29c709ed149b5546bc4358da758793a127a..3cb23b1df47f37427809453212b91f7888ae15cd 100644 (file)
@@ -123,6 +123,7 @@ mymain(void)
     DO_TEST("pci_0000_02_10_7_mdev_types");
     DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b");
     DO_TEST("ccw_0_0_ffff");
+    DO_TEST("css_0_0_ffff");
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
index e9414f429ff511f328c4f63d21b1547d65967039..d497fa979788a6e22164ae2b84a9b422ad4572dd 100644 (file)
@@ -461,6 +461,7 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd G_GNUC_UNUSED)
         case VIR_NODE_DEV_CAP_CCW_DEV:
             flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV;
             break;
+        case VIR_NODE_DEV_CAP_CSS_DEV:
         case VIR_NODE_DEV_CAP_LAST:
             break;
         }