Blame SOURCES/virt-manager-Handle-new-nodedev-name-for-mediated-devices.patch

e99ab7
From 9cb766bec0296720e98101807726dd9a488486c4 Mon Sep 17 00:00:00 2001
e99ab7
From: Jonathon Jongsma <jjongsma@redhat.com>
e99ab7
Date: Tue, 26 Oct 2021 14:18:40 -0500
e99ab7
Subject: [PATCH] Handle new nodedev name for mediated devices
e99ab7
e99ab7
libvirt recently changed the nodedev names for mediated devices due to
e99ab7
the fact that mdevctl supports defining multiple mediated devices with
e99ab7
the same UUID as long as only one is active at a time. This means that
e99ab7
the nodedev name changed from the format 'mdev_$UUID' to the format
e99ab7
'mdev_$UUID_$PARENT'.
e99ab7
e99ab7
Unfortunately, virt-install was parsing the nodedev name to extract the
e99ab7
UUID of a mediated device. This fails with the new name format.
e99ab7
Fortunately, in libvirt 7.3.0, a <uuid> field was added to the xml
e99ab7
schema for mdev devices, so we can simply use this instead, and fall
e99ab7
back to the name parsing if it doesn't exist.
e99ab7
e99ab7
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
e99ab7
(cherry picked from commit 0c146b250384ddddcefd2cc0d76b9e808377ebe5)
e99ab7
e99ab7
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2023650
e99ab7
e99ab7
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
e99ab7
---
e99ab7
 tests/data/testdriver/testdriver.xml | 14 ++++++++++++++
e99ab7
 tests/test_nodedev.py                | 14 ++++++++++++++
e99ab7
 virtinst/nodedev.py                  |  7 +++++++
e99ab7
 3 files changed, 35 insertions(+)
e99ab7
e99ab7
diff --git a/tests/data/testdriver/testdriver.xml b/tests/data/testdriver/testdriver.xml
e99ab7
index 5875732a..e4880936 100644
e99ab7
--- a/tests/data/testdriver/testdriver.xml
e99ab7
+++ b/tests/data/testdriver/testdriver.xml
e99ab7
@@ -3725,4 +3725,18 @@ ba</description>
e99ab7
   </capability>
e99ab7
 </device>
e99ab7
 
e99ab7
+<device>
e99ab7
+  <name>mdev_35ceae7f_eea5_4f28_b7f3_7b12a3e62d3c_0000_06_00_0</name>
e99ab7
+  <path>/sys/devices/pci0000:00/0000:00:02.0/35ceae7f-eea5-4f28-b7f3-7b12a3e62d3c</path>
e99ab7
+  <parent>pci_0000_06_00_0</parent>
e99ab7
+  <driver>
e99ab7
+    <name>vfio_mdev</name>
e99ab7
+  </driver>
e99ab7
+ <capability type='mdev'>
e99ab7
+    <type id='nvidia-11'/>
e99ab7
+    <iommuGroup number='12'/>
e99ab7
+    <uuid>35ceae7f-eea5-4f28-b7f3-7b12a3e62d3c</uuid>
e99ab7
+  </capability>
e99ab7
+</device>
e99ab7
+
e99ab7
 </node>
e99ab7
diff --git a/tests/test_nodedev.py b/tests/test_nodedev.py
e99ab7
index 79678bc8..41435262 100644
e99ab7
--- a/tests/test_nodedev.py
e99ab7
+++ b/tests/test_nodedev.py
e99ab7
@@ -8,6 +8,7 @@
e99ab7
 import os.path
e99ab7
 
e99ab7
 import pytest
e99ab7
+import libvirt
e99ab7
 
e99ab7
 from virtinst import Guest
e99ab7
 from virtinst import NodeDevice
e99ab7
@@ -154,6 +155,19 @@ def testPCIMdev():
e99ab7
     assert dev.parent == "pci_0000_06_00_0"
e99ab7
     assert dev.device_type == "mdev"
e99ab7
     assert dev.type_id == "nvidia-11"
e99ab7
+    assert dev.get_mdev_uuid() == "4b20d080-1b54-4048-85b3-a6a62d165c01"
e99ab7
+
e99ab7
+# libvirt <7.3.0 doesn't support <uuid> in the mdev node device xml
e99ab7
+@pytest.mark.skipif(libvirt.getVersion() < 7003000, reason="libvirt version doesn't support new mdev format")
e99ab7
+def testPCIMdevNewFormat():
e99ab7
+    conn = utils.URIs.open_testdriver_cached()
e99ab7
+    devname = "mdev_35ceae7f_eea5_4f28_b7f3_7b12a3e62d3c_0000_06_00_0"
e99ab7
+    dev = _nodeDevFromName(conn, devname)
e99ab7
+    assert dev.name == devname
e99ab7
+    assert dev.parent == "pci_0000_06_00_0"
e99ab7
+    assert dev.device_type == "mdev"
e99ab7
+    assert dev.type_id == "nvidia-11"
e99ab7
+    assert dev.get_mdev_uuid() == "35ceae7f-eea5-4f28-b7f3-7b12a3e62d3c"
e99ab7
 
e99ab7
 
e99ab7
 # NodeDevice 2 Device XML tests
e99ab7
diff --git a/virtinst/nodedev.py b/virtinst/nodedev.py
e99ab7
index f54a311c..248723b9 100644
e99ab7
--- a/virtinst/nodedev.py
e99ab7
+++ b/virtinst/nodedev.py
e99ab7
@@ -94,6 +94,12 @@ class NodeDevice(XMLBuilder):
e99ab7
     device_type = XMLProperty("./capability/@type")
e99ab7
 
e99ab7
     def get_mdev_uuid(self):
e99ab7
+        # libvirt 7.3.0 added a <uuid> element to the nodedev xml for mdev
e99ab7
+        # types. For older versions, we unfortunately have to parse the nodedev
e99ab7
+        # name, which uses the format "mdev_$UUID_WITH_UNDERSCORES"
e99ab7
+        if self.uuid is not None:
e99ab7
+            return self.uuid
e99ab7
+
e99ab7
         return self.name[5:].replace('_', '-')
e99ab7
 
e99ab7
     def compare_to_hostdev(self, hostdev):
e99ab7
@@ -191,6 +197,7 @@ class NodeDevice(XMLBuilder):
e99ab7
 
e99ab7
     # type='mdev' options
e99ab7
     type_id = XMLProperty("./capability/type/@id")
e99ab7
+    uuid = XMLProperty("./capability/uuid")
e99ab7
 
e99ab7
 
e99ab7
 def _AddressStringToHostdev(conn, addrstr):
e99ab7
-- 
e99ab7
2.31.1
e99ab7