Blame SOURCES/libvirt-nodedev-Introduce-new-mdev_types-and-mdev-nodedev-capabilities.patch

3e5111
From 74e4d42a25e8e8823ce4e7c3544b8f1944cdb471 Mon Sep 17 00:00:00 2001
3e5111
Message-Id: <74e4d42a25e8e8823ce4e7c3544b8f1944cdb471@dist-git>
3e5111
From: Erik Skultety <eskultet@redhat.com>
3e5111
Date: Thu, 18 May 2017 14:02:52 +0200
3e5111
Subject: [PATCH] nodedev: Introduce new mdev_types and mdev nodedev
3e5111
 capabilities
3e5111
3e5111
The reason for introducing two capabilities, one for the device itself
3e5111
(cap 'mdev') and one for the parent device listing the available types
3e5111
('mdev_types'), is that we should be able to do
3e5111
'virsh nodedev-list --cap' not only for existing mdev devices but also
3e5111
for devices that support creation of mdev devices, since one day libvirt
3e5111
might be actually able to create the mdev devices in an automated way
3e5111
(just like we do for NPIV/vHBA).
3e5111
3e5111
https://bugzilla.redhat.com/show_bug.cgi?id=1452072
3e5111
3e5111
Signed-off-by: Erik Skultety <eskultet@redhat.com>
3e5111
(cherry picked from commit 4385df97fed24279fa8595a1a49c9f9b3eba5be1)
3e5111
Signed-off-by: Erik Skultety <eskultet@redhat.com>
3e5111
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
3e5111
---
3e5111
 include/libvirt/libvirt-nodedev.h    |  2 ++
3e5111
 src/conf/node_device_conf.c          | 10 +++++++++-
3e5111
 src/conf/node_device_conf.h          |  6 +++++-
3e5111
 src/conf/virnodedeviceobj.c          |  4 +++-
3e5111
 src/libvirt-nodedev.c                |  2 ++
3e5111
 src/node_device/node_device_driver.c |  2 ++
3e5111
 src/node_device/node_device_udev.c   |  3 +++
3e5111
 tools/virsh-nodedev.c                |  6 ++++++
3e5111
 8 files changed, 32 insertions(+), 3 deletions(-)
3e5111
3e5111
diff --git a/include/libvirt/libvirt-nodedev.h b/include/libvirt/libvirt-nodedev.h
3e5111
index 85003903d..1e3043787 100644
3e5111
--- a/include/libvirt/libvirt-nodedev.h
3e5111
+++ b/include/libvirt/libvirt-nodedev.h
3e5111
@@ -79,6 +79,8 @@ typedef enum {
3e5111
     VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPORTS        = 1 << 10, /* Capable of vport */
3e5111
     VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_GENERIC  = 1 << 11, /* Capable of scsi_generic */
3e5111
     VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM           = 1 << 12, /* DRM device */
3e5111
+    VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES    = 1 << 13, /* Capable of mediated devices */
3e5111
+    VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV          = 1 << 14, /* Mediated device */
3e5111
 } virConnectListAllNodeDeviceFlags;
3e5111
 
3e5111
 int                     virConnectListAllNodeDevices (virConnectPtr conn,
3e5111
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
3e5111
index 56a26b578..90a087a37 100644
3e5111
--- a/src/conf/node_device_conf.c
3e5111
+++ b/src/conf/node_device_conf.c
3e5111
@@ -60,7 +60,9 @@ VIR_ENUM_IMPL(virNodeDevCap, VIR_NODE_DEV_CAP_LAST,
3e5111
               "fc_host",
3e5111
               "vports",
3e5111
               "scsi_generic",
3e5111
-              "drm")
3e5111
+              "drm",
3e5111
+              "mdev_types",
3e5111
+              "mdev")
3e5111
 
3e5111
 VIR_ENUM_IMPL(virNodeDevNetCap, VIR_NODE_DEV_CAP_NET_LAST,
3e5111
               "80203",
3e5111
@@ -540,6 +542,8 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def)
3e5111
         case VIR_NODE_DEV_CAP_DRM:
3e5111
             virBufferEscapeString(&buf, "<type>%s</type>\n", virNodeDevDRMTypeToString(data->drm.type));
3e5111
             break;
3e5111
+        case VIR_NODE_DEV_CAP_MDEV:
3e5111
+        case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
         case VIR_NODE_DEV_CAP_FC_HOST:
3e5111
         case VIR_NODE_DEV_CAP_VPORTS:
3e5111
         case VIR_NODE_DEV_CAP_LAST:
3e5111
@@ -1612,6 +1616,8 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt,
3e5111
     case VIR_NODE_DEV_CAP_DRM:
3e5111
         ret = virNodeDevCapDRMParseXML(ctxt, def, node, &caps->data.drm);
3e5111
         break;
3e5111
+    case VIR_NODE_DEV_CAP_MDEV:
3e5111
+    case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
     case VIR_NODE_DEV_CAP_FC_HOST:
3e5111
     case VIR_NODE_DEV_CAP_VPORTS:
3e5111
     case VIR_NODE_DEV_CAP_SCSI_GENERIC:
3e5111
@@ -1929,6 +1935,8 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
3e5111
     case VIR_NODE_DEV_CAP_SCSI_GENERIC:
3e5111
         VIR_FREE(data->sg.path);
3e5111
         break;
3e5111
+    case VIR_NODE_DEV_CAP_MDEV:
3e5111
+    case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
     case VIR_NODE_DEV_CAP_DRM:
3e5111
     case VIR_NODE_DEV_CAP_FC_HOST:
3e5111
     case VIR_NODE_DEV_CAP_VPORTS:
3e5111
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
3e5111
index a5d5cdd2a..e168f2e27 100644
3e5111
--- a/src/conf/node_device_conf.h
3e5111
+++ b/src/conf/node_device_conf.h
3e5111
@@ -64,6 +64,8 @@ typedef enum {
3e5111
     VIR_NODE_DEV_CAP_VPORTS,		/* HBA which is capable of vports */
3e5111
     VIR_NODE_DEV_CAP_SCSI_GENERIC,      /* SCSI generic device */
3e5111
     VIR_NODE_DEV_CAP_DRM,               /* DRM device */
3e5111
+    VIR_NODE_DEV_CAP_MDEV_TYPES,        /* Device capable of mediated devices */
3e5111
+    VIR_NODE_DEV_CAP_MDEV,              /* Mediated device */
3e5111
 
3e5111
     VIR_NODE_DEV_CAP_LAST
3e5111
 } virNodeDevCapType;
3e5111
@@ -351,7 +353,9 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps);
3e5111
                  VIR_CONNECT_LIST_NODE_DEVICES_CAP_FC_HOST       | \
3e5111
                  VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPORTS        | \
3e5111
                  VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_GENERIC  | \
3e5111
-                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM)
3e5111
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM           | \
3e5111
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES    | \
3e5111
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV)
3e5111
 
3e5111
 char *
3e5111
 virNodeDeviceGetParentName(virConnectPtr conn,
3e5111
diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
3e5111
index 3fe3ae5fe..21d5d3f75 100644
3e5111
--- a/src/conf/virnodedeviceobj.c
3e5111
+++ b/src/conf/virnodedeviceobj.c
3e5111
@@ -494,7 +494,9 @@ virNodeDeviceMatch(virNodeDeviceObjPtr devobj,
3e5111
               MATCH(FC_HOST)       ||
3e5111
               MATCH(VPORTS)        ||
3e5111
               MATCH(SCSI_GENERIC)  ||
3e5111
-              MATCH(DRM)))
3e5111
+              MATCH(DRM)           ||
3e5111
+              MATCH(MDEV_TYPES)    ||
3e5111
+              MATCH(MDEV)))
3e5111
             return false;
3e5111
     }
3e5111
 
3e5111
diff --git a/src/libvirt-nodedev.c b/src/libvirt-nodedev.c
3e5111
index 83376b0d9..44e2b4efd 100644
3e5111
--- a/src/libvirt-nodedev.c
3e5111
+++ b/src/libvirt-nodedev.c
3e5111
@@ -98,6 +98,8 @@ virNodeNumOfDevices(virConnectPtr conn, const char *cap, unsigned int flags)
3e5111
  *   VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPORTS
3e5111
  *   VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_GENERIC
3e5111
  *   VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM
3e5111
+ *   VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES
3e5111
+ *   VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV
3e5111
  *
3e5111
  * Returns the number of node devices found or -1 and sets @devices to NULL in
3e5111
  * case of error.  On success, the array stored into @devices is guaranteed to
3e5111
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
3e5111
index 99f7bc547..082160d98 100644
3e5111
--- a/src/node_device/node_device_driver.c
3e5111
+++ b/src/node_device/node_device_driver.c
3e5111
@@ -82,6 +82,8 @@ static int update_caps(virNodeDeviceObjPtr dev)
3e5111
         case VIR_NODE_DEV_CAP_FC_HOST:
3e5111
         case VIR_NODE_DEV_CAP_VPORTS:
3e5111
         case VIR_NODE_DEV_CAP_SCSI_GENERIC:
3e5111
+        case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
+        case VIR_NODE_DEV_CAP_MDEV:
3e5111
         case VIR_NODE_DEV_CAP_LAST:
3e5111
             break;
3e5111
         }
3e5111
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
3e5111
index 591da8db2..d4489e2a5 100644
3e5111
--- a/src/node_device/node_device_udev.c
3e5111
+++ b/src/node_device/node_device_udev.c
3e5111
@@ -43,6 +43,7 @@
3e5111
 #include "virpci.h"
3e5111
 #include "virstring.h"
3e5111
 #include "virnetdev.h"
3e5111
+#include "virmdev.h"
3e5111
 
3e5111
 #define VIR_FROM_THIS VIR_FROM_NODEDEV
3e5111
 
3e5111
@@ -1064,6 +1065,8 @@ static int udevGetDeviceDetails(struct udev_device *device,
3e5111
         return udevProcessSCSIGeneric(device, def);
3e5111
     case VIR_NODE_DEV_CAP_DRM:
3e5111
         return udevProcessDRMDevice(device, def);
3e5111
+    case VIR_NODE_DEV_CAP_MDEV:
3e5111
+    case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
     case VIR_NODE_DEV_CAP_SYSTEM:
3e5111
     case VIR_NODE_DEV_CAP_FC_HOST:
3e5111
     case VIR_NODE_DEV_CAP_VPORTS:
3e5111
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
3e5111
index c69144021..ad96dda1f 100644
3e5111
--- a/tools/virsh-nodedev.c
3e5111
+++ b/tools/virsh-nodedev.c
3e5111
@@ -454,6 +454,12 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
3e5111
         case VIR_NODE_DEV_CAP_DRM:
3e5111
             flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM;
3e5111
             break;
3e5111
+        case VIR_NODE_DEV_CAP_MDEV_TYPES:
3e5111
+            flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES;
3e5111
+            break;
3e5111
+        case VIR_NODE_DEV_CAP_MDEV:
3e5111
+            flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV;
3e5111
+            break;
3e5111
         case VIR_NODE_DEV_CAP_LAST:
3e5111
             break;
3e5111
         }
3e5111
-- 
3e5111
2.13.0
3e5111