[PATCH virt-install v1 2/3] virt-xml: add support for mediated devices

Shalini Chellathurai Saroja shalini at linux.ibm.com
Wed Apr 14 15:18:56 UTC 2021


Provide support to add/remove mdev in a guest domain, which is in
shut-off or running state (hotplug/unplug). Also support update of
already existing mdev device, when the guest domain is in shut-off
state. Please note that libvirt does not support update of mdev
device, when the guest domain is in running state.

Signed-off-by: Shalini Chellathurai Saroja <shalini at linux.ibm.com>
---
 .../virt-xml-add-hostdev-mdev-start.xml       | 12 +++++++
 .../cli/compare/virt-xml-add-hostdev-mdev.xml | 14 ++++++++
 tests/data/cli/compare/virt-xml-edit-all.xml  |  7 ++++
 .../compare/virt-xml-edit-hostdev-mdev.xml    | 11 +++++++
 .../compare/virt-xml-edit-simple-redirdev.xml |  2 +-
 .../compare/virt-xml-remove-hostdev-mdev.xml  | 15 +++++++++
 tests/data/testdriver/testsuite.xml           | 32 +++++++++++++++++++
 tests/test_cli.py                             |  4 +++
 tests/utils.py                                |  2 +-
 virtinst/nodedev.py                           | 11 +++++++
 10 files changed, 108 insertions(+), 2 deletions(-)
 create mode 100644 tests/data/cli/compare/virt-xml-add-hostdev-mdev-start.xml
 create mode 100644 tests/data/cli/compare/virt-xml-add-hostdev-mdev.xml
 create mode 100644 tests/data/cli/compare/virt-xml-edit-hostdev-mdev.xml
 create mode 100644 tests/data/cli/compare/virt-xml-remove-hostdev-mdev.xml

diff --git a/tests/data/cli/compare/virt-xml-add-hostdev-mdev-start.xml b/tests/data/cli/compare/virt-xml-add-hostdev-mdev-start.xml
new file mode 100644
index 00000000..3742d454
--- /dev/null
+++ b/tests/data/cli/compare/virt-xml-add-hostdev-mdev-start.xml
@@ -0,0 +1,12 @@
+       <model type="cirrus" vram="16384" heads="1" primary="yes"/>
+     </video>
+     <memballoon model="virtio"/>
++    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-ccw">
++      <source>
++        <address uuid="8e37ee90-2b51-45e3-9b25-bf8283c03110"/>
++      </source>
++    </hostdev>
+   </devices>
+ </domain>
+
+Domain 'test-state-shutoff' started successfully.
diff --git a/tests/data/cli/compare/virt-xml-add-hostdev-mdev.xml b/tests/data/cli/compare/virt-xml-add-hostdev-mdev.xml
new file mode 100644
index 00000000..c2acff8f
--- /dev/null
+++ b/tests/data/cli/compare/virt-xml-add-hostdev-mdev.xml
@@ -0,0 +1,14 @@
+     <vsock model="virtio">
+       <cid auto="no" address="5"/>
+     </vsock>
++    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-ccw">
++      <source>
++        <address uuid="8e37ee90-2b51-45e3-9b25-bf8283c03110"/>
++      </source>
++    </hostdev>
+   </devices>
+   <seclabel type="dynamic" model="selinux" relabel="yes"/>
+   <keywrap>
+
+Domain 'test-for-virtxml' defined successfully.
+Changes will take effect after the domain is fully powered off.
diff --git a/tests/data/cli/compare/virt-xml-edit-all.xml b/tests/data/cli/compare/virt-xml-edit-all.xml
index ed09effc..5bdee2aa 100644
--- a/tests/data/cli/compare/virt-xml-edit-all.xml
+++ b/tests/data/cli/compare/virt-xml-edit-all.xml
@@ -8,6 +8,13 @@
          <address domain="0x0000" bus="0x00" slot="0x19" function="0x0"/>
        </source>
        <rom bar="off"/>
++      <driver name="vfio"/>
+     </hostdev>
+     <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-ccw">
+       <source>
+         <address uuid="b1ae8bf6-38b0-4c81-9d44-78ce3f520496"/>
+       </source>
+       <address type="ccw" cssid="0xfe" ssid="0x0" devno="0x0002"/>
 +      <driver name="vfio"/>
      </hostdev>
      <redirdev bus="usb" type="tcp">
diff --git a/tests/data/cli/compare/virt-xml-edit-hostdev-mdev.xml b/tests/data/cli/compare/virt-xml-edit-hostdev-mdev.xml
new file mode 100644
index 00000000..ef5523db
--- /dev/null
+++ b/tests/data/cli/compare/virt-xml-edit-hostdev-mdev.xml
@@ -0,0 +1,11 @@
+       <source>
+         <address uuid="b1ae8bf6-38b0-4c81-9d44-78ce3f520496"/>
+       </source>
+-      <address type="ccw" cssid="0xfe" ssid="0x0" devno="0x0002"/>
++      <address type="ccw" cssid="0xfe" ssid="0x0" devno="0x0008"/>
+     </hostdev>
+     <redirdev bus="usb" type="tcp">
+       <source mode="connect" host="localhost" service="4000"/>
+
+Domain 'test-for-virtxml' defined successfully.
+Changes will take effect after the domain is fully powered off.
diff --git a/tests/data/cli/compare/virt-xml-edit-simple-redirdev.xml b/tests/data/cli/compare/virt-xml-edit-simple-redirdev.xml
index 52ffddfe..f1a0ff6c 100644
--- a/tests/data/cli/compare/virt-xml-edit-simple-redirdev.xml
+++ b/tests/data/cli/compare/virt-xml-edit-simple-redirdev.xml
@@ -1,5 +1,5 @@
        </source>
-       <rom bar="off"/>
+       <address type="ccw" cssid="0xfe" ssid="0x0" devno="0x0002"/>
      </hostdev>
 -    <redirdev bus="usb" type="tcp">
 -      <source mode="connect" host="localhost" service="4000"/>
diff --git a/tests/data/cli/compare/virt-xml-remove-hostdev-mdev.xml b/tests/data/cli/compare/virt-xml-remove-hostdev-mdev.xml
new file mode 100644
index 00000000..d4c33804
--- /dev/null
+++ b/tests/data/cli/compare/virt-xml-remove-hostdev-mdev.xml
@@ -0,0 +1,15 @@
+       </source>
+       <rom bar="off"/>
+     </hostdev>
+-    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-ccw">
+-      <source>
+-        <address uuid="b1ae8bf6-38b0-4c81-9d44-78ce3f520496"/>
+-      </source>
+-      <address type="ccw" cssid="0xfe" ssid="0x0" devno="0x0002"/>
+-    </hostdev>
+     <redirdev bus="usb" type="tcp">
+       <source mode="connect" host="localhost" service="4000"/>
+       <protocol type="raw"/>
+
+Domain 'test-for-virtxml' defined successfully.
+Changes will take effect after the domain is fully powered off.
diff --git a/tests/data/testdriver/testsuite.xml b/tests/data/testdriver/testsuite.xml
index fd255138..41c20381 100644
--- a/tests/data/testdriver/testsuite.xml
+++ b/tests/data/testdriver/testsuite.xml
@@ -259,6 +259,12 @@
       </source>
       <rom bar='off'/>
     </hostdev>
+    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-ccw">
+      <source>
+        <address uuid="b1ae8bf6-38b0-4c81-9d44-78ce3f520496"/>
+      </source>
+      <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0002'/>
+    </hostdev>
 
     <serial type='null'/>
 
@@ -737,5 +743,31 @@
   </capability>
 </device>
 
+<device>
+  <name>mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110</name>
+  <path>/sys/devices/css0/0.0.0023/8e37ee90-2b51-45e3-9b25-bf8283c03110</path>
+  <parent>css_0_0_0023</parent>
+  <driver>
+    <name>vfio_mdev</name>
+  </driver>
+  <capability type='mdev'>
+    <type id='vfio_ccw-io'/>
+    <iommuGroup number='0'/>
+  </capability>
+</device>
+
+<device>
+  <name>mdev_b1ae8bf6_38b0_4c81_9d44_78ce3f520496</name>
+  <path>/sys/devices/css0/0.0.0023/8e37ee90-2b51-45e3-9b25-bf8283c03110</path>
+  <parent>css_0_0_0023</parent>
+  <driver>
+    <name>vfio_mdev</name>
+  </driver>
+  <capability type='mdev'>
+    <type id='vfio_ccw-io'/>
+    <iommuGroup number='0'/>
+  </capability>
+</device>
+
 
 </node>
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 07b6b2bb..467e9e3d 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -1288,6 +1288,7 @@ c.add_compare("--edit mac=00:11:7f:33:44:55 --network target=nic55", "edit-selec
 c.add_compare("--edit target=hda --disk boot_order=1", "edit-select-disk-bootorder")
 c.add_compare("--edit path=/dev/null --disk path=,target=fdb,boot_order=12", "edit-disk-unset")  # --disk matching, using empty value to unset path
 c.add_compare("--edit --memballoon none", "edit-disable-memballoon")
+c.add_compare("--edit address.devno=0x0002 --hostdev address.devno=0x0008", "edit-hostdev-mdev")
 
 c = vixml.add_category("edit and start selection", "test-state-shutoff --print-diff --start")
 c.add_compare("--define --edit target=vda --disk boot_order=1", "start-select-disk-bootorder")
@@ -1322,6 +1323,8 @@ c.add_compare("--remove-device --disk /dev/null", "remove-disk-path")
 c.add_compare("--remove-device --video all", "remove-video-all")
 c.add_compare("--remove-device --host-device 0x04b3:0x4485", "remove-hostdev-name")
 c.add_compare("--remove-device --memballoon all", "remove-memballoon")
+c.add_compare("--add-device --hostdev mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110", "add-hostdev-mdev")
+c.add_compare("--remove-device --hostdev mdev_b1ae8bf6_38b0_4c81_9d44_78ce3f520496", "remove-hostdev-mdev")
 
 c = vixml.add_category("add/rm devices and start", "test-state-shutoff --print-diff --start")
 c.add_invalid("--add-device --pm suspend_to_disk=yes")  # --add-device without a device
@@ -1332,6 +1335,7 @@ c.add_compare("--define --add-device --host-device usb_device_4b3_4485_noserial"
 c.add_compare("--add-device --disk %(EXISTIMG1)s,bus=virtio,target=vdf", "add-disk-basic-start")
 c.add_compare("--add-device --disk %(NEWIMG1)s,size=.01", "add-disk-create-storage-start")
 c.add_compare("--remove-device --disk /dev/null", "remove-disk-path-start")
+c.add_compare("--add-device --hostdev mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110", "add-hostdev-mdev-start")
 
 c = vixml.add_category("add/rm devices OS KVM", "--connect %(URI-KVM)s test --print-diff --define")
 c.add_compare("--add-device --disk %(EXISTIMG1)s", "kvm-add-disk-os-from-xml")  # Guest OS (none) from XML
diff --git a/tests/utils.py b/tests/utils.py
index 802d6590..8a8a243a 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -232,7 +232,7 @@ def diff_compare(actual_out, filename=None, expect_out=None):
             open(filename, "w").write(actual_out)
         expect_out = open(filename).read()
 
-    diff = xmlutil.diff(expect_out, actual_out,
+    diff = xmlutil.diff(expect_out.rstrip(), actual_out.rstrip(),
             filename or '', "Generated output")
     if diff:
         raise AssertionError("Conversion outputs did not match.\n%s" % diff)
diff --git a/virtinst/nodedev.py b/virtinst/nodedev.py
index 97841794..873002ec 100644
--- a/virtinst/nodedev.py
+++ b/virtinst/nodedev.py
@@ -5,6 +5,7 @@
 # See the COPYING file in the top-level directory.
 
 import os
+import uuid
 
 from .logger import log
 from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
@@ -101,6 +102,12 @@ class NodeDevice(XMLBuilder):
                 _compare_int(self.bus, hostdev.bus) and
                 _compare_int(self.device, hostdev.device))
 
+        if self.device_type == "mdev":
+            if hostdev.type != "mdev":
+                return False
+
+            return uuid.UUID(self.name[5:].replace('_', '-')) == uuid.UUID(hostdev.uuid)
+
         return False
 
 
@@ -207,6 +214,10 @@ def _AddressStringToHostdev(conn, addrstr):
             hostdev.type = "usb"
             hostdev.bus = bus
             hostdev.device = device
+
+        elif "mdev_" in addrstr:
+            hostdev.type = "mdev"
+            hostdev.uuid = addrstr[5:].replace('_', '-')
         else:
             raise RuntimeError("Unknown address type")
     except Exception:
-- 
2.26.2




More information about the virt-tools-list mailing list