On 2/19/19 8:17 AM, Nikolay Shirokovskiy wrote:
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(a)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(+)
Interesting - historically the @class was added by commit fe2af45bb and
parsed in subsequent commit 3ad6dcf3.
I am somewhat surprised some compiler hasn't complained since 'class'
is one of those keywords. In fact the _virNodeDevCapUSBIf uses _class
and has a comment about that.
Anyway, it seems reasonable to add the PCI class to the output; however,
making them required concerns me only because I don't know enough about
all the arches in question and of course the lack of HAL (although one
would hope it's old enough to not matter).
You are right, there is one consumer of the CreateXML processing and
that's with vHBA/NPIV SCSI LUNs.
I don't have enough PCI device knowledge to know if/how all the PCI
devices would have that data. Still since udevProcessPCI would fail if
the PCI_CLASS wasn't present for @device, then I suppose it would fail
sooner anyway. Thus leaving only the CreateXML path to worry about.
The additional check for > 0xffffff should be safe - fwiw, I am
preferential to 0xffffff on the comparison, but since I see
virPCIDeviceAddressIsValid would use 0xFFFF (0xFF, 0x1F), that's just a
small detail.
Since we have to wait for 5.0.2, why not add a patch before this one
that uses _class instead of class and then add a 3rd patch for
docs/news.xml to describe the new output.
If anyone else has issues - then hopefully this response will allow
those to be raised.
John
diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index 29244a8..b72d7db 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.1.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 0498489..0f45d79 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 1b1f57d..d2f5183 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.class);
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->class, def,
+ _("no PCI class supplied for
'%s'"),
+ _("invalid PCI class supplied for
'%s'")) < 0)
+ goto out;
+
+ if (pci_dev->class > 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 5150fd1..387fce7 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 c1be9f7..b07d14f 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 a2d5756..8e71e3f 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 8f243b4..6fa2b40 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 9e8dace..74036a6 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 4e6323a..c30c0d0 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 355eaaa..096055e 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 e9eb122..8259cd0 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 6d5d85b..2039e22 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 8e89900..3ffe53b 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 6e1dc86..6bd1292 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 18172e9..59f5ec8 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 6e154d6..96a4c51 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>