[libvirt PATCH 2/4] nodedev: support auto-start property for mdevs

Jonathon Jongsma jjongsma at redhat.com
Fri May 14 21:28:59 UTC 2021


From: Boris Fiuczynski <fiuczy at linux.ibm.com>

This adds a new element to the mdev capabilities xml schema that
represents the start policy for a defined mediated device. The actual
auto-start functionality is handled behind the scenes by mdevctl, but it
wasn't yet hooked up in libvirt.

Signed-off-by: Boris Fiuczynski <fiuczy at linux.ibm.com>
Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
---
 docs/formatnode.html.in                       | 10 ++++++++++
 docs/schemas/nodedev.rng                      | 11 ++++++++++
 src/conf/node_device_conf.c                   | 20 ++++++++++++++++++-
 src/conf/node_device_conf.h                   | 12 +++++++++++
 src/libvirt_private.syms                      |  2 ++
 src/node_device/node_device_driver.c          |  7 ++++++-
 .../mdevctl-list-multiple.out.xml             |  4 ++++
 ...v_3627463d_b7f0_4fea_b468_f1da537d301b.xml |  1 +
 ...v_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml |  1 +
 9 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index c58cd01395..3065570405 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -384,6 +384,16 @@
                 The order that they appear in the xml definition determines the
                 order that they will be written to the device.
               </dd>
+              <dt><code>start</code></dt>
+              <dd>
+                This element represents the start policy for the device.  It
+                has a required attribute <code>type</code>, which can have a
+                value of <code>auto</code> or <code>manual</code>. Mediated
+                devices with an <code>auto</code> start type will be started
+                automatically by the host when the parent device becomes
+                available (either on boot, or when the parent device is
+                attached). Otherwise the device must be started manually.
+              </dd>
             </dl>
           </dd>
           <dt><code>ccw</code></dt>
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 777227c38a..660cbda3be 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -622,6 +622,17 @@
           </attribute>
         </element>
       </optional>
+      <optional>
+        <element name="start">
+          <attribute name="type">
+            <choice>
+              <value>manual</value>
+              <value>auto</value>
+            </choice>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
       <optional>
         <element name="uuid">
           <ref name="UUID"/>
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 861f43f6c4..9c1192fe3b 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -85,6 +85,12 @@ VIR_ENUM_IMPL(virNodeDevDRM,
               "render",
 );
 
+VIR_ENUM_IMPL(virNodeDevMdevStart,
+              VIR_NODE_DEV_MDEV_START_LAST,
+              "manual",
+              "auto",
+);
+
 static int
 virNodeDevCapsDefParseString(const char *xpath,
                              xmlXPathContextPtr ctxt,
@@ -528,6 +534,8 @@ virNodeDeviceCapMdevDefFormat(virBuffer *buf,
 
     virBufferEscapeString(buf, "<type id='%s'/>\n", data->mdev.type);
     virBufferEscapeString(buf, "<uuid>%s</uuid>\n", data->mdev.uuid);
+    virBufferEscapeString(buf, "<start type='%s'/>\n",
+                          virNodeDevMdevStartTypeToString(data->mdev.start));
     virBufferAsprintf(buf, "<iommuGroup number='%u'/>\n",
                       data->mdev.iommuGroupNumber);
 
@@ -1149,7 +1157,6 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
                 return -1;
             }
             storage->removable_media_size = val;
-
             ctxt->node = orignode2;
         } else {
             virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -1923,6 +1930,7 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
     g_autofree xmlNodePtr *attrs = NULL;
     size_t i;
     g_autofree char *uuidstr = NULL;
+    g_autofree char *starttype = NULL;
 
     ctxt->node = node;
 
@@ -1944,6 +1952,16 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
         virUUIDFormat(uuidbuf, mdev->uuid);
     }
 
+    if ((starttype = virXPathString("string(./start[1]/@type)", ctxt))) {
+        if ((mdev->start = virNodeDevMdevStartTypeFromString(starttype)) < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown mdev start type '%s' for '%s'"), starttype, def->name);
+            return -1;
+        }
+    } else {
+        mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL;
+    }
+
     /* 'iommuGroup' is optional, only report an error if the supplied value is
      * invalid (-2), not if it's missing (-1) */
     if (virXPathUInt("number(./iommuGroup[1]/@number)",
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
index a60562e4fe..1a31133c4c 100644
--- a/src/conf/node_device_conf.h
+++ b/src/conf/node_device_conf.h
@@ -124,6 +124,17 @@ typedef enum {
 
 VIR_ENUM_DECL(virNodeDevDRM);
 
+typedef enum {
+    /* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */
+    VIR_NODE_DEV_MDEV_START_MANUAL,
+    VIR_NODE_DEV_MDEV_START_AUTO,
+
+    VIR_NODE_DEV_MDEV_START_LAST
+} virNodeDevMdevStartType;
+
+VIR_ENUM_DECL(virNodeDevMdevStart);
+
+
 typedef struct _virNodeDevCapSystemHardware virNodeDevCapSystemHardware;
 struct _virNodeDevCapSystemHardware {
     char *vendor_name;
@@ -151,6 +162,7 @@ struct _virNodeDevCapMdev {
     char *type;
     unsigned int iommuGroupNumber;
     char *uuid;
+    virNodeDevMdevStartType start;
     virMediatedDeviceAttr **attributes;
     size_t nattributes;
 };
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1df4b8cfe8..7aae36de56 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -846,6 +846,8 @@ virNodeDeviceGetSCSIHostCaps;
 virNodeDeviceGetSCSITargetCaps;
 virNodeDeviceGetWWNs;
 virNodeDeviceUpdateCaps;
+virNodeDevMdevStartTypeFromString;
+virNodeDevMdevStartTypeToString;
 
 
 # conf/node_device_event.h
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index 8a0a2c3847..a9f605715b 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -615,7 +615,8 @@ nodeDeviceDefToMdevctlConfig(virNodeDeviceDef *def, char **buf)
     if (virJSONValueObjectAppendString(json, "mdev_type", mdev->type) < 0)
         return -1;
 
-    if (virJSONValueObjectAppendString(json, "start", "manual") < 0)
+    if (virJSONValueObjectAppendString(json, "start",
+                                       virNodeDevMdevStartTypeToString(mdev->start)) < 0)
         return -1;
 
     if (mdev->attributes) {
@@ -1014,6 +1015,8 @@ nodeDeviceParseMdevctlChildDevice(const char *parent,
     mdev->uuid = g_strdup(uuid);
     mdev->type =
         g_strdup(virJSONValueObjectGetString(props, "mdev_type"));
+    mdev->start =
+        virNodeDevMdevStartTypeFromString(virJSONValueObjectGetString(props, "start"));
 
     attrs = virJSONValueObjectGet(props, "attrs");
 
@@ -1683,6 +1686,8 @@ nodeDeviceDefCopyFromMdevctl(virNodeDeviceDef *dst,
         dstmdev->uuid = g_strdup(srcmdev->uuid);
     }
 
+    dstmdev->start = srcmdev->start;
+
     if (virMediatedDeviceAttrsCopy(dstmdev, srcmdev))
         ret = true;
 
diff --git a/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
index cf7e966256..83a3010455 100644
--- a/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
+++ b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
@@ -4,6 +4,7 @@
   <capability type='mdev'>
     <type id='i915-GVTg_V5_4'/>
     <uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid>
+    <start type='manual'/>
     <iommuGroup number='0'/>
   </capability>
 </device>
@@ -13,6 +14,7 @@
   <capability type='mdev'>
     <type id='i915-GVTg_V5_4'/>
     <uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid>
+    <start type='auto'/>
     <iommuGroup number='0'/>
   </capability>
 </device>
@@ -22,6 +24,7 @@
   <capability type='mdev'>
     <type id='i915-GVTg_V5_8'/>
     <uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid>
+    <start type='manual'/>
     <iommuGroup number='0'/>
     <attr name='testattr' value='42'/>
   </capability>
@@ -32,6 +35,7 @@
   <capability type='mdev'>
     <type id='vfio_ap-passthrough'/>
     <uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid>
+    <start type='manual'/>
     <iommuGroup number='0'/>
     <attr name='assign_adapter' value='5'/>
     <attr name='assign_adapter' value='6'/>
diff --git a/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml b/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml
index 470e5917ec..30dda60e87 100644
--- a/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml
+++ b/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml
@@ -3,6 +3,7 @@
   <parent>computer</parent>
   <capability type='mdev'>
     <type id='mtty-1'/>
+    <start type='manual'/>
     <iommuGroup number='12'/>
   </capability>
 </device>
diff --git a/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml b/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml
index 106f759333..1988ffa679 100644
--- a/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml
+++ b/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml
@@ -4,6 +4,7 @@
   <parent>ap_matrix</parent>
   <capability type='mdev'>
     <type id='vfio_ap-passthrough'/>
+    <start type='manual'/>
     <iommuGroup number='0'/>
   </capability>
 </device>
-- 
2.31.1




More information about the libvir-list mailing list