Add Rust abstractions for the Single Root I/O Virtualization (SR-IOV) capability of a PCI device. Provide a minimal set of wrappers for the SR-IOV C API to enable and disable SR-IOV for a device, and query if a PCI device is a Physical Function (PF) or Virtual Function (VF).
Using the #[vtable] attribute, extend the pci::Driver trait with an optional bus callback sriov_configure() that is invoked when a user-space application writes the number of VFs to the sysfs file `sriov_numvfs` to enable SR-IOV, or zero to disable SR-IOV [1]. Add a method physfn() to return the Physical Function (PF) device for a Virtual Function (VF) device in the bound device context. Unlike for a PCI driver written in C, guarantee that when a VF device is bound to a driver, the underlying PF device is bound to a driver, too. When a device with enabled VFs is unbound from a driver, invoke the sriov_configure() callback to disable SR-IOV before the remove() callback. To ensure the guarantee is upheld, call disable_sriov() to remove all VF devices if the driver has not done so already. For PF drivers written in C, disabling SR-IOV on remove() may be opted into by setting the flag managed_sriov in the pci_driver structure. For PF drivers written in Rust, disabling SR-IOV on unbind() is mandatory. This series is based on Danilo Krummrich's series "Device::drvdata() and driver/driver interaction (auxiliary)" applied to driver-core-next, which similarly guarantees that when an auxiliary bus device is bound to a driver, the underlying parent device is bound to a driver, too [2, 3]. Add an SR-IOV driver sample that exercises the SR-IOV capability using QEMU's 82576 (igb) emulation and was used to test the abstractions [4]. [1] https://docs.kernel.org/PCI/pci-iov-howto.html [2] https://lore.kernel.org/rust-for-linux/[email protected]/ [3] https://lore.kernel.org/rust-for-linux/[email protected]/ [4] https://www.qemu.org/docs/master/system/devices/igb.html Signed-off-by: Peter Colberg <[email protected]> --- Changes in v2: - Move logic to disable SR-IOV on remove() from Rust to C. - Add driver flag managed_sriov to opt into disabling SR-IOV on remove(). - Demonstrate flag managed_sriov for dfl-pci driver. - Uphold safety guarantee for physfn() when PF driver is written in C. - Let physfn() return error if driver flag managed_sriov is unset. - Use "kernel vertical" style on imports. - Use to_result() to handle error in enable_sriov(). - Note Bound device context in SAFETY comments for {enable,disable}_sriov(). - Demonstrate how to reach driver data of PF device from VF device. - Add missing #[vtable] attribute in PCI driver trait example. - Add missing #[vtable] attribute in nova-core driver. - Define struct MyDriver such that physfn() example compiles. - Replace VF -> PF in doc comment of is_physfn(). - Add #[inline] to is_physfn() and is_virtfn(). - Link to v1: https://lore.kernel.org/r/[email protected] --- John Hubbard (1): rust: pci: add is_virtfn(), to check for VFs Peter Colberg (9): PCI: add driver flag to opt into disabling SR-IOV on remove() fpga: dfl-pci: set driver flag to disable SR-IOV on remove() rust: pci: add {enable,disable}_sriov(), to control SR-IOV capability rust: pci: add vtable attribute to pci::Driver trait rust: pci: add bus callback sriov_configure(), to control SR-IOV from sysfs rust: pci: add is_physfn(), to check for PFs rust: pci: add num_vf(), to return number of VFs rust: pci: add physfn(), to return PF device for VF device samples: rust: add SR-IOV driver sample MAINTAINERS | 1 + drivers/fpga/dfl-pci.c | 17 ++-- drivers/gpu/nova-core/driver.rs | 1 + drivers/pci/iov.c | 41 ++++++++- drivers/pci/pci-driver.c | 3 +- drivers/pci/pci.h | 2 + include/linux/pci.h | 8 ++ rust/kernel/pci.rs | 165 ++++++++++++++++++++++++++++++++++ samples/rust/Kconfig | 11 +++ samples/rust/Makefile | 1 + samples/rust/rust_dma.rs | 1 + samples/rust/rust_driver_auxiliary.rs | 1 + samples/rust/rust_driver_pci.rs | 1 + samples/rust/rust_driver_sriov.rs | 127 ++++++++++++++++++++++++++ 14 files changed, 366 insertions(+), 14 deletions(-) --- base-commit: c5048ddee936ca5ce0aeb79172ce512130779d31 change-id: 20251026-rust-pci-sriov-ca8f501b2ae3 Best regards, -- Peter Colberg <[email protected]>
