3e5111
From 8c30b1e683b37d67d7fe827f6ab63174c596494e Mon Sep 17 00:00:00 2001
3e5111
Message-Id: <8c30b1e683b37d67d7fe827f6ab63174c596494e@dist-git>
3e5111
From: Erik Skultety <eskultet@redhat.com>
3e5111
Date: Thu, 18 May 2017 14:02:49 +0200
3e5111
Subject: [PATCH] docs: Provide a nodedev driver stub documentation
3e5111
3e5111
There's lot more to document about the nodedev driver, besides PCI and
3e5111
SR-IOV (even this might need to be extended), but let's start small-ish
3e5111
and at least have a page for it linked from the drivers.html.
3e5111
3e5111
https://bugzilla.redhat.com/show_bug.cgi?id=1452072
3e5111
3e5111
Signed-off-by: Erik Skultety <eskultet@redhat.com>
3e5111
(cherry picked from commit a94d431dc46070034de7798f572dc1d257542a50)
3e5111
Signed-off-by: Erik Skultety <eskultet@redhat.com>
3e5111
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
3e5111
---
3e5111
 docs/drivers.html.in    |   6 +-
3e5111
 docs/drvnodedev.html.in | 189 ++++++++++++++++++++++++++++++++++++++++++++++++
3e5111
 2 files changed, 194 insertions(+), 1 deletion(-)
3e5111
 create mode 100644 docs/drvnodedev.html.in
3e5111
3e5111
diff --git a/docs/drivers.html.in b/docs/drivers.html.in
3e5111
index be7483b9b..61993861e 100644
3e5111
--- a/docs/drivers.html.in
3e5111
+++ b/docs/drivers.html.in
3e5111
@@ -4,7 +4,11 @@
3e5111
   <body>
3e5111
     

Internal drivers

3e5111
 
3e5111
-    
    3e5111
    +    
      3e5111
      +      
    • Hypervisor drivers
    • 3e5111
      +      
    • Storage drivers
    • 3e5111
      +      
    • Node device driver
    • 3e5111
      +    
      3e5111
       
      3e5111
           

      3e5111
             The libvirt public API delegates its implementation to one or
      3e5111
      diff --git a/docs/drvnodedev.html.in b/docs/drvnodedev.html.in
      3e5111
      new file mode 100644
      3e5111
      index 000000000..0a3870343
      3e5111
      --- /dev/null
      3e5111
      +++ b/docs/drvnodedev.html.in
      3e5111
      @@ -0,0 +1,189 @@
      3e5111
      +
      3e5111
      +
      3e5111
      +<html xmlns="http://www.w3.org/1999/xhtml">
      3e5111
      +  <body>
      3e5111
      +    

      Host device management

      3e5111
      +
      3e5111
      +    

      3e5111
      +      Libvirt provides management of both physical and virtual host devices
      3e5111
      +      (historically also referred to as node devices) like USB, PCI, SCSI, and
      3e5111
      +      network devices. This also includes various virtualization capabilities
      3e5111
      +      which the aforementioned devices provide for utilization, for example
      3e5111
      +      SR-IOV, NPIV, DRM, etc.
      3e5111
      +    

      3e5111
      +
      3e5111
      +    

      3e5111
      +      The node device driver provides means to list and show details about host
      3e5111
      +      devices (virsh nodedev-list,
      3e5111
      +      virsh nodedev-dumpxml), which are generic and can be used
      3e5111
      +      with all devices. It also provides means to create and destroy devices
      3e5111
      +      (virsh nodedev-create, virsh nodedev-destroy)
      3e5111
      +      which are meant to be used to create virtual devices, currently only
      3e5111
      +      supported by NPIV
      3e5111
      +      (more info about NPIV)).
      3e5111
      +      Devices on the host system are arranged in a tree-like hierarchy, with
      3e5111
      +      the root node being called computer. The node device driver
      3e5111
      +      supports two backends to manage the devices, HAL and udev, with the former
      3e5111
      +      being deprecated in favour of the latter.
      3e5111
      +    

      3e5111
      +
      3e5111
      +    

      3e5111
      +      The generic format of a host device XML can be seen below.
      3e5111
      +      To identify a device both within the host and the device tree hierarchy,
      3e5111
      +      the following elements are used:
      3e5111
      +    

      3e5111
      +      
      3e5111
      +        
      name
      3e5111
      +        
      3e5111
      +          The device's name will be generated by libvirt using the subsystem,
      3e5111
      +          like pci and the device's sysfs basename.
      3e5111
      +        
      3e5111
      +        
      path
      3e5111
      +        
      3e5111
      +          Fully qualified sysfs path to the device.
      3e5111
      +        
      3e5111
      +        
      parent
      3e5111
      +        
      3e5111
      +          This element identifies the parent node in the device hierarchy. The
      3e5111
      +          value of the element will correspond with the device parent's
      3e5111
      +          name element or computer if the device does
      3e5111
      +          not have any parent.
      3e5111
      +        
      3e5111
      +        
      driver
      3e5111
      +        
      3e5111
      +          This elements reports the driver in use for this device. The presence
      3e5111
      +          of this element in the output XML depends on whether the underlying
      3e5111
      +          device manager (most likely udev) exposes information about the
      3e5111
      +          driver.
      3e5111
      +        
      3e5111
      +        
      capability
      3e5111
      +        
      3e5111
      +          Describes the device in terms of feature support. The element has one
      3e5111
      +          mandatory attribute type the value of which determines
      3e5111
      +          the type of the device. Currently recognized values for the attribute
      3e5111
      +          are:
      3e5111
      +          system,
      3e5111
      +          pci,
      3e5111
      +          usb,
      3e5111
      +          usb_device,
      3e5111
      +          net,
      3e5111
      +          scsi,
      3e5111
      +          scsi_host (Since 0.4.7),
      3e5111
      +          fc_host,
      3e5111
      +          vports,
      3e5111
      +          scsi_target (Since 0.7.3),
      3e5111
      +          storage (Since 1.0.4),
      3e5111
      +          scsi_generic (Since 1.0.7),
      3e5111
      +          drm (Since 3.1.0), and
      3e5111
      +          This element can be nested in which case it further specifies a
      3e5111
      +          device's capability. Refer to specific device types to see more values
      3e5111
      +          for the type attribute which are exclusive.
      3e5111
      +        
      3e5111
      +      
      3e5111
      +
      3e5111
      +    

      Basic structure of a node device

      3e5111
      +    
      3e5111
      +<device>
      3e5111
      +  <name>pci_0000_00_17_0</name>
      3e5111
      +  <path>/sys/devices/pci0000:00/0000:00:17.0</path>
      3e5111
      +  <parent>computer</parent>
      3e5111
      +  <driver>
      3e5111
      +    <name>ahci</name>
      3e5111
      +  </driver>
      3e5111
      +  <capability type='pci'>
      3e5111
      +...
      3e5111
      +  </capability>
      3e5111
      +</device>
      3e5111
      +
      3e5111
      +    
        3e5111
        +
        3e5111
        +    

        PCI host devices

        3e5111
        +    
        3e5111
        +      
        capability
        3e5111
        +      
        3e5111
        +        When used as top level element, the supported values for the
        3e5111
        +        type attribute are pci and
        3e5111
        +        phys_function (see SR-IOV below).
        3e5111
        +      
        3e5111
        +    
        3e5111
        +    
        3e5111
        +<device>
        3e5111
        +  <name>pci_0000_04_00_1</name>
        3e5111
        +  <path>/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.1</path>
        3e5111
        +  <parent>pci_0000_00_06_0</parent>
        3e5111
        +  <driver>
        3e5111
        +    <name>igb</name>
        3e5111
        +  </driver>
        3e5111
        +  <capability type='pci'>
        3e5111
        +    <domain>0</domain>
        3e5111
        +    <bus>4</bus>
        3e5111
        +    <slot>0</slot>
        3e5111
        +    <function>1</function>
        3e5111
        +    <product id='0x10c9'>82576 Gigabit Network Connection</product>
        3e5111
        +    <vendor id='0x8086'>Intel Corporation</vendor>
        3e5111
        +    <iommuGroup number='15'>
        3e5111
        +      <address domain='0x0000' bus='0x04' slot='0x00' function='0x1'/>
        3e5111
        +    </iommuGroup>
        3e5111
        +    <numa node='0'/>
        3e5111
        +    <pci-express>
        3e5111
        +      <link validity='cap' port='1' speed='2.5' width='2'/>
        3e5111
        +      <link validity='sta' speed='2.5' width='2'/>
        3e5111
        +    </pci-express>
        3e5111
        +  </capability>
        3e5111
        +</device>
        3e5111
        +
        3e5111
        +    

        3e5111
        +      The XML format for a PCI device stays the same for any further
        3e5111
        +      capabilities it supports, a single nested <capability>
        3e5111
        +      element will be included for each capability the device supports.
        3e5111
        +    

        3e5111
        +
        3e5111
        +    

        SR-IOV capability

        3e5111
        +    

        3e5111
        +      Single root input/output virtualization (SR-IOV) allows sharing of the
        3e5111
        +      PCIe resources by multiple virtual environments. That is achieved by
        3e5111
        +      slicing up a single full-featured physical resource called physical
        3e5111
        +      function (PF) into multiple devices called virtual functions (VFs) sharing
        3e5111
        +      their configuration with the underlying PF. Despite the SR-IOV
        3e5111
        +      specification, the amount of VFs that can be created on a PF varies among
        3e5111
        +      manufacturers.
        3e5111
        +    

        3e5111
        +
        3e5111
        +    

        3e5111
        +      Suppose the NIC above was also SR-IOV capable, it would
        3e5111
        +      also include a nested
        3e5111
        +      <capability> element enumerating all virtual
        3e5111
        +      functions available on the physical device (physical port) like in the
        3e5111
        +      example below.
        3e5111
        +    

        3e5111
        +
        3e5111
        +    
        3e5111
        +<capability type='pci'>
        3e5111
        +...
        3e5111
        +  <capability type='virt_functions' maxCount='7'>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x10' function='0x3'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x10' function='0x5'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x10' function='0x7'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x11' function='0x1'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x11' function='0x3'/>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x11' function='0x5'/>
        3e5111
        +  </capability>
        3e5111
        +...
        3e5111
        +</capability>
        3e5111
        +    

        3e5111
        +      A SR-IOV child device on the other hand, would then report its top level
        3e5111
        +      capability type as a phys_function instead:
        3e5111
        +    

        3e5111
        +
        3e5111
        +    
        3e5111
        +<device>
        3e5111
        +...
        3e5111
        +  <capability type='phys_function'>
        3e5111
        +    <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
        3e5111
        +  </capability>
        3e5111
        +...
        3e5111
        +<device>
        3e5111
        +
        3e5111
        +  </body>
        3e5111
        +</html>
        3e5111
        -- 
        3e5111
        2.13.0
        3e5111