[libvirt PATCH v4 23/25] nodedev: add <uuid> element to mdev caps

Jonathon Jongsma posted 25 patches 5 years ago
There is a newer version of this series
[libvirt PATCH v4 23/25] nodedev: add <uuid> element to mdev caps
Posted by Jonathon Jongsma 5 years ago
It will be useful to be able to specify a particular UUID for a mediated
device when defining the node device. To accomodate that, allow this to
be specified in the xml schema. This patch also parses and formats that
value to the xml, but does not yet use it.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
---
 docs/schemas/nodedev.rng                      | 43 +++++++++++--------
 src/conf/node_device_conf.c                   | 15 +++++++
 .../mdevctl-list-multiple.out.xml             |  4 ++
 3 files changed, 44 insertions(+), 18 deletions(-)

diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 5840dc9f0d..777227c38a 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -606,27 +606,34 @@
   </define>
 
   <define name="capmdev">
-    <attribute name="type">
-      <value>mdev</value>
-    </attribute>
-    <element name="type">
-      <attribute name="id">
-        <data type="string"/>
+    <interleave>
+      <attribute name="type">
+        <value>mdev</value>
       </attribute>
-    </element>
-    <optional>
-      <element name="iommuGroup">
-        <attribute name="number">
-          <ref name="unsignedInt"/>
+      <element name="type">
+        <attribute name="id">
+          <data type="string"/>
         </attribute>
       </element>
-    </optional>
-    <zeroOrMore>
-      <element name="attr">
-        <attribute name="name"/>
-        <attribute name="value"/>
-      </element>
-    </zeroOrMore>
+      <optional>
+        <element name="iommuGroup">
+          <attribute name="number">
+            <ref name="unsignedInt"/>
+          </attribute>
+        </element>
+      </optional>
+      <optional>
+        <element name="uuid">
+          <ref name="UUID"/>
+        </element>
+      </optional>
+      <zeroOrMore>
+        <element name="attr">
+          <attribute name="name"/>
+          <attribute name="value"/>
+        </element>
+      </zeroOrMore>
+    </interleave>
   </define>
 
   <define name="capccwdev">
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 1093a461af..44cf4d152a 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -527,6 +527,7 @@ virNodeDeviceCapMdevDefFormat(virBufferPtr buf,
     size_t i;
 
     virBufferEscapeString(buf, "<type id='%s'/>\n", data->mdev.type);
+    virBufferEscapeString(buf, "<uuid>%s</uuid>\n", data->mdev.uuid);
     virBufferAsprintf(buf, "<iommuGroup number='%u'/>\n",
                       data->mdev.iommuGroupNumber);
 
@@ -2024,6 +2025,8 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
     int nattrs = 0;
     g_autofree xmlNodePtr *attrs = NULL;
     size_t i;
+    g_autofree char *uuidstr = NULL;
+    unsigned char uuidbuf[VIR_UUID_BUFLEN];
 
     ctxt->node = node;
 
@@ -2033,6 +2036,18 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
         goto out;
     }
 
+    if ((uuidstr = virXPathString("string(./uuid[1])", ctxt))) {
+        /* make sure that the provided uuid is valid */
+        if (virUUIDParse(uuidstr, uuidbuf) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Invalid uuid '%s' for '%s'"), mdev->uuid,
+                           def->name);
+            return -1;
+        }
+        mdev->uuid = g_new0(char, VIR_UUID_STRING_BUFLEN);
+        virUUIDFormat(uuidbuf, mdev->uuid);
+    }
+
     /* '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/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
index 543ad916b7..cf7e966256 100644
--- a/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
+++ b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml
@@ -3,6 +3,7 @@
   <parent>0000:00:02.0</parent>
   <capability type='mdev'>
     <type id='i915-GVTg_V5_4'/>
+    <uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid>
     <iommuGroup number='0'/>
   </capability>
 </device>
@@ -11,6 +12,7 @@
   <parent>0000:00:02.0</parent>
   <capability type='mdev'>
     <type id='i915-GVTg_V5_4'/>
+    <uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid>
     <iommuGroup number='0'/>
   </capability>
 </device>
@@ -19,6 +21,7 @@
   <parent>0000:00:02.0</parent>
   <capability type='mdev'>
     <type id='i915-GVTg_V5_8'/>
+    <uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid>
     <iommuGroup number='0'/>
     <attr name='testattr' value='42'/>
   </capability>
@@ -28,6 +31,7 @@
   <parent>matrix</parent>
   <capability type='mdev'>
     <type id='vfio_ap-passthrough'/>
+    <uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid>
     <iommuGroup number='0'/>
     <attr name='assign_adapter' value='5'/>
     <attr name='assign_adapter' value='6'/>
-- 
2.26.2

Re: [libvirt PATCH v4 23/25] nodedev: add <uuid> element to mdev caps
Posted by Erik Skultety 4 years, 11 months ago
On Wed, Feb 03, 2021 at 11:39:07AM -0600, Jonathon Jongsma wrote:
> It will be useful to be able to specify a particular UUID for a mediated
> device when defining the node device. To accomodate that, allow this to
> be specified in the xml schema. This patch also parses and formats that
> value to the xml, but does not yet use it.
> 
> Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
> ---
...

>  
> +    if ((uuidstr = virXPathString("string(./uuid[1])", ctxt))) {
> +        /* make sure that the provided uuid is valid */
> +        if (virUUIDParse(uuidstr, uuidbuf) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Invalid uuid '%s' for '%s'"), mdev->uuid,

we don't have mdev->uuid at this point yet, so:
s/mdev->uuid/uuidstr

> +                           def->name);

we also haven't generated any name yet, so ^this yields "new device". I'd
suggest to hardcode the message with "new mdev device" instead of using
def->name.

Being able to specify UUIDs with mdevs directly is great.

Reviewed-by: Erik Skultety <eskultet@redhat.com>