[libvirt] [PATCH v2 2/3] xml: nodedev: add class info for pci capability

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Tue Mar 12 11:14:40 UTC 2019


This info can be useful to filter devices visible
to mgmt clients so that they won't see devices that
unsafe/not meaningful to pass thru.

Provide class info the way it is provided by udev or
kernel that is as single 6-digit hexadecimal.

Class element is not optional. I guess this should not
break users that use virNodeDeviceCreateXML because
they probably specify only scsi_host capability on
input and then node device driver gets other capabilities
from udev after device appeared.

HAL driver does not get support for the new element in
this patch.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
---
 docs/formatnode.html.in                                     |  5 +++++
 docs/schemas/nodedev.rng                                    |  5 +++++
 src/conf/node_device_conf.c                                 | 13 +++++++++++++
 tests/nodedevschemadata/pci_0000_00_02_0_header_type.xml    |  1 +
 tests/nodedevschemadata/pci_0000_00_1c_0_header_type.xml    |  1 +
 tests/nodedevschemadata/pci_0000_02_10_7_mdev_types.xml     |  1 +
 tests/nodedevschemadata/pci_0000_02_10_7_sriov.xml          |  1 +
 .../nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all.xml |  1 +
 .../pci_0000_02_10_7_sriov_pf_vfs_all_header_type.xml       |  1 +
 tests/nodedevschemadata/pci_0000_02_10_7_sriov_vfs.xml      |  1 +
 .../pci_0000_02_10_7_sriov_zero_vfs_max_count.xml           |  1 +
 tests/nodedevschemadata/pci_1002_71c4.xml                   |  1 +
 tests/nodedevschemadata/pci_8086_0c0c_snd_hda_intel.xml     |  1 +
 tests/nodedevschemadata/pci_8086_10c9_sriov_pf.xml          |  1 +
 tests/nodedevschemadata/pci_8086_4238_pcie_wireless.xml     |  1 +
 tests/nodedevschemadata/pci_82579LM_network_adapter.xml     |  1 +
 16 files changed, 36 insertions(+)

diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index 29244a8984..5095b97d8a 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -70,6 +70,10 @@
           <dd>Describes a device on the host's PCI bus.  Sub-elements
             include:
             <dl>
+              <dt><code>class</code></dt>
+              <dd>Combined class, subclass and
+                programming interface codes as 6-digit hexadecimal number.
+                <span class="since">Since 5.2.0</span></dd>
               <dt><code>domain</code></dt>
               <dd>Which domain the device belongs to.</dd>
               <dt><code>bus</code></dt>
@@ -381,6 +385,7 @@
     <name>igb</name>
   </driver>
   <capability type='pci'>
+    <class>0x020000</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>0</slot>
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 0498489cfd..0f45d7993e 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -133,6 +133,11 @@
       <value>pci</value>
     </attribute>
 
+    <element name='class'>
+      <data type="string">
+        <param name="pattern">0x[0-9a-fA-F]{6}</param>
+      </data>
+    </element>
     <element name='domain'>
       <ref name='unsignedLong'/>
     </element>
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 5de51d1f6b..19c601ae11 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -208,6 +208,7 @@ virNodeDeviceCapPCIDefFormat(virBufferPtr buf,
 {
     size_t i;
 
+    virBufferAsprintf(buf, "<class>0x%.6x</class>\n", data->pci_dev.klass);
     virBufferAsprintf(buf, "<domain>%d</domain>\n",
                       data->pci_dev.domain);
     virBufferAsprintf(buf, "<bus>%d</bus>\n", data->pci_dev.bus);
@@ -1644,6 +1645,18 @@ virNodeDevCapPCIDevParseXML(xmlXPathContextPtr ctxt,
     orignode = ctxt->node;
     ctxt->node = node;
 
+    if (virNodeDevCapsDefParseHexId("string(./class[1])", ctxt,
+                                    &pci_dev->klass, def,
+                                    _("no PCI class supplied for '%s'"),
+                                    _("invalid PCI class supplied for '%s'")) < 0)
+        goto out;
+
+    if (pci_dev->klass > 0xffffff) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("invalid PCI class supplied for '%s'"), def->name);
+        goto out;
+    }
+
     if (virNodeDevCapsDefParseULong("number(./domain[1])", ctxt,
                                     &pci_dev->domain, def,
                                     _("no PCI domain ID supplied for '%s'"),
diff --git a/tests/nodedevschemadata/pci_0000_00_02_0_header_type.xml b/tests/nodedevschemadata/pci_0000_00_02_0_header_type.xml
index 5150fd1e8b..387fce7051 100644
--- a/tests/nodedevschemadata/pci_0000_00_02_0_header_type.xml
+++ b/tests/nodedevschemadata/pci_0000_00_02_0_header_type.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_00_02_0</name>
   <parent>computer</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>0</bus>
     <slot>2</slot>
diff --git a/tests/nodedevschemadata/pci_0000_00_1c_0_header_type.xml b/tests/nodedevschemadata/pci_0000_00_1c_0_header_type.xml
index c1be9f7d9c..b07d14faa5 100644
--- a/tests/nodedevschemadata/pci_0000_00_1c_0_header_type.xml
+++ b/tests/nodedevschemadata/pci_0000_00_1c_0_header_type.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_00_1c_0</name>
   <parent>computer</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>0</bus>
     <slot>28</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_mdev_types.xml b/tests/nodedevschemadata/pci_0000_02_10_7_mdev_types.xml
index a2d57569af..8e71e3f897 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_mdev_types.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_mdev_types.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_sriov.xml b/tests/nodedevschemadata/pci_0000_02_10_7_sriov.xml
index 8f243b4d61..6fa2b406a5 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_sriov.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_sriov.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all.xml b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all.xml
index 9e8dace020..74036a65fa 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all_header_type.xml b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all_header_type.xml
index 4e6323a3ec..c30c0d0d2b 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all_header_type.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_pf_vfs_all_header_type.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_vfs.xml b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_vfs.xml
index 355eaaad97..096055e2ae 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_vfs.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_vfs.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_zero_vfs_max_count.xml b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_zero_vfs_max_count.xml
index e9eb122bfe..8259cd059b 100644
--- a/tests/nodedevschemadata/pci_0000_02_10_7_sriov_zero_vfs_max_count.xml
+++ b/tests/nodedevschemadata/pci_0000_02_10_7_sriov_zero_vfs_max_count.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_10_7</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>16</slot>
diff --git a/tests/nodedevschemadata/pci_1002_71c4.xml b/tests/nodedevschemadata/pci_1002_71c4.xml
index 6d5d85bc3c..2039e2201f 100644
--- a/tests/nodedevschemadata/pci_1002_71c4.xml
+++ b/tests/nodedevschemadata/pci_1002_71c4.xml
@@ -2,6 +2,7 @@
   <name>pci_1002_71c4</name>
   <parent>pci_8086_27a1</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>1</bus>
     <slot>0</slot>
diff --git a/tests/nodedevschemadata/pci_8086_0c0c_snd_hda_intel.xml b/tests/nodedevschemadata/pci_8086_0c0c_snd_hda_intel.xml
index 8e8990073d..3ffe53b8c9 100644
--- a/tests/nodedevschemadata/pci_8086_0c0c_snd_hda_intel.xml
+++ b/tests/nodedevschemadata/pci_8086_0c0c_snd_hda_intel.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_00_03_0</name>
   <parent>computer</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>0</bus>
     <slot>3</slot>
diff --git a/tests/nodedevschemadata/pci_8086_10c9_sriov_pf.xml b/tests/nodedevschemadata/pci_8086_10c9_sriov_pf.xml
index 6e1dc868a6..6bd1292095 100644
--- a/tests/nodedevschemadata/pci_8086_10c9_sriov_pf.xml
+++ b/tests/nodedevschemadata/pci_8086_10c9_sriov_pf.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_02_00_0</name>
   <parent>pci_0000_00_04_0</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>2</bus>
     <slot>0</slot>
diff --git a/tests/nodedevschemadata/pci_8086_4238_pcie_wireless.xml b/tests/nodedevschemadata/pci_8086_4238_pcie_wireless.xml
index 18172e900b..59f5ec8622 100644
--- a/tests/nodedevschemadata/pci_8086_4238_pcie_wireless.xml
+++ b/tests/nodedevschemadata/pci_8086_4238_pcie_wireless.xml
@@ -2,6 +2,7 @@
   <name>pci_0000_03_00_0</name>
   <parent>pci_0000_00_1c_1</parent>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>3</bus>
     <slot>0</slot>
diff --git a/tests/nodedevschemadata/pci_82579LM_network_adapter.xml b/tests/nodedevschemadata/pci_82579LM_network_adapter.xml
index 6e154d6de3..96a4c51762 100644
--- a/tests/nodedevschemadata/pci_82579LM_network_adapter.xml
+++ b/tests/nodedevschemadata/pci_82579LM_network_adapter.xml
@@ -5,6 +5,7 @@
     <name>e1000e</name>
   </driver>
   <capability type='pci'>
+    <class>0xffffff</class>
     <domain>0</domain>
     <bus>0</bus>
     <slot>25</slot>
-- 
2.16.5




More information about the libvir-list mailing list