On Fri, May 28, 2021 at 10:58:05PM +0300, Dmitrii Shcherbakov wrote: > Hello Libvirt Developers, > > I am looking for some feedback on a planned enhancement to Libvirt: the aim > is > to store a portion of PCI(e) Vital Product Data (VPD) for each device along > with other PCI/PCIe device information already collected. Specifically, the > SN > (Serial Number) read-only field of a VPD data structure of a device is of > interest which is described in PCI/PCIe specs (PCI local bus 2.1+ and PCIe > 4.0+). > > The context for this is the cross-project work in OpenStack (Nova, Neutron), > OVS and OVN to support for off-path SmartNIC DPUs ([1], [2], [3], [4]). The > Nova specification [1] provides an overview of the relevant hardware and the > use-case for board serial numbers, however, VPD is the standard capability > in > the PCI/PCIe specifications not tied to the use-case in particular so the > suggestion from the Nova core team was to aim at introducing means of > collecting this information via Libvirt. It can then be retrieved by the > respective virt driver in Nova via Libvirt without having to introduce this > code into Nova itself. I've talked with Sean Mooney at little about the use case this morning. IIUC, the high level scenario is as follows - The main host machine has a PCI controller topology to which the NICs are attached. This is how the host OS and by extension libvirt, nova, etc, see the PCI devices. - There is a second PCI controller topology to which the NICs are attached. This is only visible to the arm cores for the offload engine - Nova/Neutron can identify the NICs based on the PCI topology seen by the host OS, but need to tell the NIC mgmt software which NIC to use in a way that can be undersood by the offload cores. IOW, the PCI address is not usable as a unique identifier because there are two completely independant PCI topologies with no mapping between them. The VPD data provides a replacement way to identify a NIC based on a unique serial number that is indendant of PCI topology. Nova needs this serial number in order to configure the device offload featues. This seems like a reasonable feature request to me, since there is a piece of info that apps using libvirt need, and libvirt does not expose this. Requiring the mgmt app like Nova to dig into the host PCI config space indicates a clear gap in libvirt functionality. > I would like to suggest the following to be done in Libvirt: > > 1) adding the code for extracting a serial number from VPD for PCI/PCIe > devices > in general and storing it for exposure via the Libvirt API; > More specifically, I propose adding a nested capability called "vpd" under > VIR_NODE_DEV_CAP_PCI_DEV: > <capability type='pci'> > <capability type='vpd'> > <serial>UNIQUESERIAL</serial> > <!-- ... other VPD attributes if present --> > </capability> > <!-- ... --> > </capability> This looks like a reasonable proposal > 2) (optional) implementing functionality to obtain a board serial number via > devlink-info for PCIe devices if they do not expose a VPD capability > but the device driver can retrieve it via firmware. The board serial number > can be stored in the same element as suggested above. Is scenario (2) going to be at all common ? What would be a reason why the info is not exposed via the standardized VPD - is it just a legacy hardware issue ? > Not all devices expose the devlink API and even fewer do expose board serial > via devlink-info: > > * devlink was added in 4.10 [11]; > * devlink-info was introduced in 5.1 [12]; > * querying for board.serial_number was added in kernel 5.9 [13] and iproute2 > 5.9.0 [14]; > * Besides the generic devlink infrastructure support above, device drivers > also need to support exposing this field. > > Therefore, implementing two approaches (sysfs VPD, devlink) is preferable > for better compatibility. > > I would appreciate any feedback on whether this potential addition makes > sense. > If so, I can look into implementing this. It makes sense to me. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|