On Sat Dec 6, 2025 at 9:42 PM JST, Zhi Wang wrote: > Add a wrapper for the `pci_sriov_get_totalvfs()` helper, allowing drivers > to query the number of total SR-IOV virtual functions a PCI device > supports. > > This is useful for components that need to conditionally enable features > based on SR-IOV capability. > > Signed-off-by: Zhi Wang <[email protected]> > --- > rust/kernel/pci.rs | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs > index 7fcc5f6022c1..9a82e83dfd30 100644 > --- a/rust/kernel/pci.rs > +++ b/rust/kernel/pci.rs > @@ -514,6 +514,18 @@ pub fn pci_class(&self) -> Class { > // SAFETY: `self.as_raw` is a valid pointer to a `struct pci_dev`. > Class::from_raw(unsafe { (*self.as_raw()).class }) > } > + > + /// Returns total number of VFs, or `Err(ENODEV)` if none available. > + pub fn sriov_get_totalvfs(&self) -> Result<i32> {
The return type if `pci_sriov_get_totalvfs` is a bit unfortunate. It returns `driver_max_VFs`, which is a `u16` [1], but not before implicitly converting it to an `int` - even though it doesn't make use of negative values to indicate errors! Even its C callers eventually compare its returned value to a `u16` [2]. How about a cleanup patch to fix it to return `u16`, so we can make the Rust wrapper return a `Result<NonZero<u16>>`? [1] https://elixir.bootlin.com/linux/v6.18/source/drivers/pci/iov.c#L1281 [2] https://elixir.bootlin.com/linux/v6.18/source/drivers/pci/iov.c#L474
