[libvirt PATCH v4 0/4] Add a PCI/PCIe device VPD Capability

Dmitrii Shcherbakov dmitrii.shcherbakov at canonical.com
Wed Sep 22 16:10:53 UTC 2021


Forgot to add `-s` when using `git publish` so "Signed-off-by" is missing -
my apologies about that. Will add it in v5 if there will be a need for it.

Best Regards,
Dmitrii Shcherbakov
LP/MM/oftc: dmitriis


On Wed, Sep 22, 2021 at 5:23 PM Dmitrii Shcherbakov <
dmitrii.shcherbakov at canonical.com> wrote:

> Add support for deserializing the binary PCI/PCIe VPD format and
> exposing VPD resources as XML elements in a new nested capability
> of PCI/PCIe devices called 'vpd'.
>
> The series contains the following incremental changes:
>
> * The PCI VPD parser module, in-memory resource representation
>   and tests;
> * VPD-related helpers added to the virpci module;
> * VPD capability support: XML serialization/deserialization from/into
>   VPD resource data structures;
> * Documentation.
>
> The VPD format is specified in "I.3. VPD Definitions" in PCI specs
> (2.2+) and "6.28.1 VPD Format" PCIe 4.0. As section 6.28 in PCIe 4.0
> notes, the PCI Local Bus and PCIe VPD formats are binary compatible
> and PCIe 4.0 merely started incorporating what was already present in
> PCI specs.
>
> Linux kernel exposes a binary blob in the VPD format via sysfs since
> v2.6.26 (commit 94e6108803469a37ee1e3c92dafdd1d59298602f) which requires
> a parser to interpret.
>
> There are usage scenarios where information such as the board serial
> number needs to be retrieved from PCI(e) VPD. Projects like Nova can
> utilize this information for cases which involve virtual interface
> plugging on SmartNIC DPUs but there may be other scenarios and types of
> information useful to retrieve from VPD. The fact that the format is
> binary requires proper parsing instead of substring searching hence the
> full parser is proposed. Likewise, checksum validation requires proper
> parsing as well.
>
> A usage example is present here:
> https://review.opendev.org/c/openstack/nova/+/808199
>
> The patch follows a prior discussion on the mailing list which has
> additional context about the use-case but a narrower proposal:
>
> https://listman.redhat.com/archives/libvir-list/2021-May/msg00873.html
> https://www.mail-archive.com/libvir-list@redhat.com/msg218165.html
>
> The new functionality is mostly contained in virpcivpd with a
> couple of new functions added to virpci. Additionally, the necessary XML
> serialization/deserialization and glue code is added to expose the VPD
> capability to external clients as XML.
>
> A new capability flag is added along with a new capability in order to
> allow for filtering of PCI devices with the VPD capability using virsh:
>
> virsh nodedev-list --cap vpd
> sudo virsh nodedev-dumpxml --device pci_dddd_bb_ss_f
>
> In this example having the root uid is required in order to access the
> vpd sysfs entry, therefore, the nodedev XML output will only contain
> the VPD capability if virsh is run as root.
>
> The capability is treated as dynamic due to the presence of read-write
> sections in the VPD format per PCI/PCIe specs (the idea being that
> read-write resource fields may potentially be altered by the DPU OS
> over time independently from the host OS).
>
> Unit tests cover the parser functionality (including many possible
> invalid cases), in-memory representation as well as XML serialization
> and deserialization.
>
> Manual functional testing was performed with 2 DPUs and several other
> NIC models which expose PCI(e) VPD. Testing have also been performed
> for devices that do not have VPD or those that expose a VPD capability
> but exhibit invalid behavior (I/O errors while reading a sysfs entry).
>
> Per the existing guidelines, the implementation relies heavily on glib
> for various purposes.
>
> https://libvirt.org/glib-adoption.html
>
> The v4 of the patch includes a number of fixes compared to v3:
>
> * Fixed the patch to correctly build against older glib (2.56.0);
>   * Notably, glib commit 86c073dba9d82ef3f1bc3d3116b058b9b5c3b1eb (in
>           2.59.0) fixes g_autolist support for derivable Glib types. To
> make
>           things work in 2.56.0 a workaround is conditionally applied;
>         * virCreateAnonymousFile now uses a temporary file which is
>           unlinked after creation instead of memfd because OpenSUSE 15.2
> does
>                 not have support memfd;
> * Keyword resources now use GTree instead of GHashTable as the
>   underlying data structure:
>   * This allows for stable ordering which is important for XML2XML tests
>           as they were failing with when GLib versions were different,
>                 resulting in a different ordering of elements;
>         * The keyword resource iteration function was complex and got
> replaced
>           by a simpler g_tree_foreach-based approach;
> * Added more testing: functions added to virpci are now assessed by
>   creating a mocked vpd file under a mocked sysfs structure while the
>         parser is still tested in virpcivpdtest file;
> * Refactoring:
>   * Applied changes based on the indent tool operation with some
>           post-processing;
>         * Renamed functions which had the Glib naming style to use camel
> case
>           where possible. Auto-generated declarations are an exception:
>                 gobject/gtype.h defines type_name##_init,
> type_name##_class_init,
>                 module_obj_name##_get_type functions which were left
> unchanged;
>         * camelCase is now used for local variables and function
> parameters;
>         * Replaced //-style comments with multi-line ones;
>         * Split out one patch into 4 based on distinct features:
>           * PCI VPD parser functionality and the respective in-memory
> types;
>                 * VPD helpers in virpci;
>                 * XML serialization/deserialization and VPD capability
> support;
>                 * Documentation.
>
> Build & test results for targets in ci/manifest.yaml:
>
> ci/helper test --meson-args='-Dexpensive_tests=enabled' <target>
>
> * First Patch:
> https://gist.github.com/dshcherb/8388165df0b62b71c2c95fbc351d1aee
> * Patches 1 and 2:
> https://gist.github.com/dshcherb/33c3f0f6e717788aea24b5dae2210f38
> * Patches 1, 2 and 3:
> https://gist.github.com/dshcherb/400bcb13d01fd28030f4986e3e178262
> * All patches:
> https://gist.github.com/dshcherb/b2fc8bd3a349f6357a25da85c542dda3
>
> Dmitrii Shcherbakov (4):
>   Add a PCI/PCIe device VPD Parser
>   Add PCI VPD-related helper functions to virpci
>   Add PCI VPD Capability Support
>   Add PCI VPD Capability Documentation
>
>  build-aux/syntax-check.mk                     |   4 +-
>  docs/drvnodedev.html.in                       |  46 ++
>  docs/formatnode.html.in                       |  24 +-
>  docs/schemas/nodedev.rng                      |  40 +
>  include/libvirt/libvirt-nodedev.h             |   1 +
>  po/POTFILES.in                                |   1 +
>  src/conf/node_device_conf.c                   | 271 +++++++
>  src/conf/node_device_conf.h                   |   6 +-
>  src/conf/virnodedeviceobj.c                   |   7 +-
>  src/libvirt_private.syms                      |  17 +
>  src/node_device/node_device_driver.c          |   2 +
>  src/node_device/node_device_udev.c            |   2 +
>  src/util/meson.build                          |   1 +
>  src/util/virpci.c                             |  62 ++
>  src/util/virpci.h                             |   3 +
>  src/util/virpcivpd.c                          | 755 ++++++++++++++++++
>  src/util/virpcivpd.h                          | 117 +++
>  src/util/virpcivpdpriv.h                      |  45 ++
>  tests/meson.build                             |   1 +
>  .../pci_0000_42_00_0_vpd.xml                  |  33 +
>  .../pci_0000_42_00_0_vpd.xml                  |   1 +
>  tests/nodedevxml2xmltest.c                    |   1 +
>  tests/testutils.c                             |  40 +
>  tests/testutils.h                             |   4 +
>  tests/virpcimock.c                            |  30 +
>  tests/virpcitest.c                            |  64 ++
>  tests/virpcivpdtest.c                         | 704 ++++++++++++++++
>  tools/virsh-nodedev.c                         |   3 +
>  28 files changed, 2280 insertions(+), 5 deletions(-)
>  create mode 100644 src/util/virpcivpd.c
>  create mode 100644 src/util/virpcivpd.h
>  create mode 100644 src/util/virpcivpdpriv.h
>  create mode 100644 tests/nodedevschemadata/pci_0000_42_00_0_vpd.xml
>  create mode 120000 tests/nodedevxml2xmlout/pci_0000_42_00_0_vpd.xml
>  create mode 100644 tests/virpcivpdtest.c
>
> --
> 2.30.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210922/ec1ab112/attachment-0001.htm>


More information about the libvir-list mailing list