[libvirt] [PATCH] PCI passthrough docs, tests and minor change

Daniel Veillard veillard at redhat.com
Mon Jan 12 10:30:51 UTC 2009


  The following add the documentation for the PCI passthrough,
extends the RNG and add an extra test for the QEmu parsing to
args and serialization back to XML.
  I also noticed that we parse (and save) and extra PCI domain
argument, but it's not actually used when calling qemu, so I
assume it's a missing feature for QEmu and just decided to patch
the code to not save the extra value when not defined (i.e. 0).
  Whether it should just be removed at this point is IMHO a separate
decision, which is why I took the way with minimal changes. Note
that the domain attribute is not documented nor part or the RNG
either at this point.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/
-------------- next part --------------
Index: docs/formatdomain.html
===================================================================
RCS file: /data/cvs/libxen/docs/formatdomain.html,v
retrieving revision 1.16
diff -u -r1.16 formatdomain.html
--- docs/formatdomain.html	6 Jan 2009 08:48:48 -0000	1.16
+++ docs/formatdomain.html	12 Jan 2009 10:23:02 -0000
@@ -140,7 +140,7 @@
                 <ul><li>
                     <a href="#elementsDisks">Hard drives, floppy disks, CDROMs</a>
                   </li><li>
-                    <a href="#elementsUSB">USB devices</a>
+                    <a href="#elementsUSB">USB and PCI devices</a>
                   </li><li>
                     <a href="#elementsNICS">Network interfaces</a>
                     <ul><li>
@@ -464,11 +464,12 @@
 	attribute provides the sub-type. <span class="since">Since 0.1.8</span>
       </dd></dl>
         <h4>
-          <a name="elementsUSB" id="elementsUSB">USB devices</a>
+          <a name="elementsUSB" id="elementsUSB">USB and PCI devices</a>
         </h4>
         <p>
-      USB devices attached to the host can be passed through to the guest using
-      the <code>hostdev</code> element. <span class="since">since after 0.4.4</span>
+      USB and PCI devices attached to the host can be passed through to the guest using
+      the <code>hostdev</code> element. <span class="since">since after
+      0.4.4 for USB and 0.6.0 for PCI (KVM only)</span>:
     </p>
         <pre>
           ...
@@ -479,20 +480,38 @@
 	    </source>
 	  </hostdev>
 	  ...</pre>
+        <p>or:</p>
+        <pre>
+          ...
+	  <hostdev mode='subsystem' type='pci'>
+	    <source>
+	      <address>bus='0x06' slot='0x02' function='0x0'</address>
+	    </source>
+	  </hostdev>
+	  ...</pre>
         <dl><dt><code>hostdev</code></dt><dd>The <code>hostdev</code> element is the main container for describing
       host devices. For usb device passthrough <code>mode</code> is always
-      "subsystem" and <code>type</code> is "usb".
+      "subsystem" and <code>type</code> is "usb" for an USB device and "pci"
+      for a PCI device..
       </dd><dt><code>source</code></dt><dd>The source element describes the device as seen from the host.
       The USB device can either be addressed by vendor / product id using the
       <code>vendor</code> and <code>product</code> elements or by the device's
-      address on the hosts using the <code>address</code> element.</dd><dt><code>vendor</code>, <code>product</code></dt><dd>The <code>vendor</code> and <code>product</code> elements each have an
+      address on the hosts using the <code>address</code> element.
+      PCI devices on the other hand can only be described by their
+      <code>address</code></dd><dt><code>vendor</code>, <code>product</code></dt><dd>The <code>vendor</code> and <code>product</code> elements each have an
       <code>id</code> attribute that specifies the USB vendor and product id.
       The ids can be given in decimal, hexadecimal (starting with 0x) or
-      octal (starting with 0) form.</dd><dt><code>address</code></dt><dd>The <code>address</code> element has a <code>bus</code> and
-      <code>device</code> attribute to specify the USB bus and device number
-      the device appears at on the host. The values of these attributes can
-      be given in decimal, hexadecimal (starting with 0x) or octal (starting
-      with 0) form.</dd></dl>
+      octal (starting with 0) form.</dd><dt><code>address</code></dt><dd>The <code>address</code> element for USB devices has a
+      <code>bus</code> and <code>device</code> attribute to specify the
+      USB bus and device number the device appears at on the host.
+      The values of these attributes can be given in decimal, hexadecimal
+      (starting with 0x) or octal (starting with 0) form.
+      For PCI devices the element carries 3 attributes allowing to designate
+      the device as can be found with the <code>lspci</code> command, the
+      <code>bus</code> attribute allows the hexadecimal values 0 to ff, the
+      <code>slot</code> attribute allows the hexadecimal values 0 to 1f, and
+      the <code>function</code> attribute allows the hexadecimal values 0 to
+      7.</dd></dl>
         <h4>
           <a name="elementsNICS" id="elementsNICS">Network interfaces</a>
         </h4>
Index: docs/formatdomain.html.in
===================================================================
RCS file: /data/cvs/libxen/docs/formatdomain.html.in,v
retrieving revision 1.11
diff -u -r1.11 formatdomain.html.in
--- docs/formatdomain.html.in	26 Dec 2008 13:37:54 -0000	1.11
+++ docs/formatdomain.html.in	12 Jan 2009 10:23:02 -0000
@@ -375,11 +375,12 @@
       </dd>
     </dl>
 
-    <h4><a name="elementsUSB">USB devices</a></h4>
+    <h4><a name="elementsUSB">USB and PCI devices</a></h4>
 
     <p>
-      USB devices attached to the host can be passed through to the guest using
-      the <code>hostdev</code> element. <span class="since">since after 0.4.4</span>
+      USB and PCI devices attached to the host can be passed through to the guest using
+      the <code>hostdev</code> element. <span class="since">since after
+      0.4.4 for USB and 0.6.0 for PCI (KVM only)</span>:
     </p>
 
     <pre>
@@ -391,28 +392,46 @@
 	    </source>
 	  </hostdev>
 	  ...</pre>
+    <p>or:</p>
+    <pre>
+          ...
+	  <hostdev mode='subsystem' type='pci'>
+	    <source>
+	      <address>bus='0x06' slot='0x02' function='0x0'</address>
+	    </source>
+	  </hostdev>
+	  ...</pre>
 
     <dl>
       <dt><code>hostdev</code></dt>
       <dd>The <code>hostdev</code> element is the main container for describing
       host devices. For usb device passthrough <code>mode</code> is always
-      "subsystem" and <code>type</code> is "usb".
+      "subsystem" and <code>type</code> is "usb" for an USB device and "pci"
+      for a PCI device..
       <dt><code>source</code></dt>
       <dd>The source element describes the device as seen from the host.
       The USB device can either be addressed by vendor / product id using the
       <code>vendor</code> and <code>product</code> elements or by the device's
-      address on the hosts using the <code>address</code> element.</dd>
+      address on the hosts using the <code>address</code> element.
+      PCI devices on the other hand can only be described by their
+      <code>address</code></dd>
       <dt><code>vendor</code>, <code>product</code></dt>
       <dd>The <code>vendor</code> and <code>product</code> elements each have an
       <code>id</code> attribute that specifies the USB vendor and product id.
       The ids can be given in decimal, hexadecimal (starting with 0x) or
       octal (starting with 0) form.</dd>
       <dt><code>address</code></dt>
-      <dd>The <code>address</code> element has a <code>bus</code> and
-      <code>device</code> attribute to specify the USB bus and device number
-      the device appears at on the host. The values of these attributes can
-      be given in decimal, hexadecimal (starting with 0x) or octal (starting
-      with 0) form.</dd>
+      <dd>The <code>address</code> element for USB devices has a
+      <code>bus</code> and <code>device</code> attribute to specify the
+      USB bus and device number the device appears at on the host.
+      The values of these attributes can be given in decimal, hexadecimal
+      (starting with 0x) or octal (starting with 0) form.
+      For PCI devices the element carries 3 attributes allowing to designate
+      the device as can be found with the <code>lspci</code> command, the
+      <code>bus</code> attribute allows the hexadecimal values 0 to ff, the
+      <code>slot</code> attribute allows the hexadecimal values 0 to 1f, and
+      the <code>function</code> attribute allows the hexadecimal values 0 to
+      7.</dd>
     </dl>
 
     <h4><a name="elementsNICS">Network interfaces</a></h4>
Index: docs/libvirt.rng
===================================================================
RCS file: /data/cvs/libxen/docs/libvirt.rng,v
retrieving revision 1.16
diff -u -r1.16 libvirt.rng
--- docs/libvirt.rng	11 Dec 2008 11:44:30 -0000	1.16
+++ docs/libvirt.rng	12 Jan 2009 10:23:02 -0000
@@ -890,6 +890,7 @@
             <choice>
               <ref name="usbproduct"/>
               <ref name="usbaddress"/>
+              <ref name="pciaddress"/>
             </choice>
           </element>
       </group>
@@ -920,6 +921,19 @@
     </element>
   </define>
 
+  <define name="pciaddress">
+    <element name="address">
+      <attribute name="bus">
+        <ref name="pciBus"/>
+      </attribute>
+      <attribute name="slot">
+        <ref name="pciSlot"/>
+      </attribute>
+      <attribute name="function">
+        <ref name="pciFunc"/>
+      </attribute>
+    </element>
+  </define>
   <!--
       Devices attached to a domain.
     -->
@@ -1069,4 +1083,19 @@
       <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
     </data>
   </define>
+  <define name='pciBus'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
+    </data>
+  </define>
+  <define name='pciSlot'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
+    </data>
+  </define>
+  <define name='pciFunc'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-7]</param>
+    </data>
+  </define>
 </grammar>
Index: src/domain_conf.c
===================================================================
RCS file: /data/cvs/libxen/src/domain_conf.c,v
retrieving revision 1.52
diff -u -r1.52 domain_conf.c
--- src/domain_conf.c	8 Jan 2009 13:54:20 -0000	1.52
+++ src/domain_conf.c	12 Jan 2009 10:23:03 -0000
@@ -3137,11 +3137,20 @@
         }
     }
     if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
-        virBufferVSprintf(buf, "        <address domain='0x%.4x' bus='0x%.2x' slot='0x%.2x' function='0x%.1x'/>\n",
-                          def->source.subsys.u.pci.domain,
-                          def->source.subsys.u.pci.bus,
-                          def->source.subsys.u.pci.slot,
-                          def->source.subsys.u.pci.function);
+        if (def->source.subsys.u.pci.domain != 0) {
+            virBufferVSprintf(buf,
+    "        <address domain='0x%.4x' bus='0x%.2x' slot='0x%.2x' function='0x%.1x'/>\n",
+                              def->source.subsys.u.pci.domain,
+                              def->source.subsys.u.pci.bus,
+                              def->source.subsys.u.pci.slot,
+                              def->source.subsys.u.pci.function);
+        } else {
+            virBufferVSprintf(buf,
+    "        <address bus='0x%.2x' slot='0x%.2x' function='0x%.1x'/>\n",
+                              def->source.subsys.u.pci.bus,
+                              def->source.subsys.u.pci.slot,
+                              def->source.subsys.u.pci.function);
+        }
     }
 
     virBufferAddLit(buf, "      </source>\n");
Index: tests/qemuxml2argvtest.c
===================================================================
RCS file: /data/cvs/libxen/tests/qemuxml2argvtest.c,v
retrieving revision 1.36
diff -u -r1.36 qemuxml2argvtest.c
--- tests/qemuxml2argvtest.c	18 Dec 2008 15:22:49 -0000	1.36
+++ tests/qemuxml2argvtest.c	12 Jan 2009 10:23:03 -0000
@@ -224,6 +224,8 @@
     DO_TEST("hostdev-usb-product", 0);
     DO_TEST("hostdev-usb-address", 0);
 
+    DO_TEST("hostdev-pci-address", 0);
+
     virCapabilitiesFree(driver.caps);
 
     return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
Index: tests/qemuxml2xmltest.c
===================================================================
RCS file: /data/cvs/libxen/tests/qemuxml2xmltest.c,v
retrieving revision 1.24
diff -u -r1.24 qemuxml2xmltest.c
--- tests/qemuxml2xmltest.c	8 Jan 2009 13:54:20 -0000	1.24
+++ tests/qemuxml2xmltest.c	12 Jan 2009 10:23:03 -0000
@@ -123,6 +123,7 @@
 
     DO_TEST("hostdev-usb-product");
     DO_TEST("hostdev-usb-address");
+    DO_TEST("hostdev-pci-address");
 
     virCapabilitiesFree(driver.caps);
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: qemuxml2argv-hostdev-pci-address.xml
Type: text/xml
Size: 739 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20090112/f2bb2683/attachment-0001.xml>
-------------- next part --------------
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -pidfile /nowhere/QEMUGuest2.pid -no-acpi -boot c -hda /dev/HostVG/QEMUGuest2 -net none -serial none -parallel none -usb -pcidevice host=06:12.5


More information about the libvir-list mailing list