From: "Danilo Krummrich" <dakr@kernel.org>
To: "Jason Gunthorpe" <jgg@ziepe.ca>
Cc: "Peter Colberg" <pcolberg@redhat.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Robin Murphy" <robin.murphy@arm.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Dave Ertman" <david.m.ertman@intel.com>,
"Ira Weiny" <ira.weiny@intel.com>,
"Leon Romanovsky" <leon@kernel.org>,
linux-pci@vger.kernel.org, rust-for-linux@vger.kernel.org,
linux-kernel@vger.kernel.org,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Alistair Popple" <apopple@nvidia.com>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
"John Hubbard" <jhubbard@nvidia.com>,
"Zhi Wang" <zhiw@nvidia.com>
Subject: Re: [PATCH 7/8] rust: pci: add physfn(), to return PF device for VF device
Date: Sat, 22 Nov 2025 23:23:16 +1300 [thread overview]
Message-ID: <DEF5EC79OOT4.2MT1ET4IKXS5Y@kernel.org> (raw)
In-Reply-To: <20251121232642.GG233636@ziepe.ca>
On Sat Nov 22, 2025 at 12:26 PM NZDT, Jason Gunthorpe wrote:
> On Wed, Nov 19, 2025 at 05:19:11PM -0500, Peter Colberg wrote:
>> Add a method 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.
>
> You can't do this as an absolutely statement from rust code alone,
> this statement is confused.
Indeed! However, I'd like to see that we actually provide this guarantee from
the C PCI code.
So far I haven't heard a convincing reason for not providing this guarantee. The
only reason not to guarantee this I have heard is that some PF drivers only
enable SR-IOV and hence could be unloaded afterwards. However, I think there is
no strong reason to do so.
What I would like to see is that we unbind VF drivers when the PF driver is
unbound in general, analogous to what we are guaranteed by the auxiliary bus.
>> + #[cfg(CONFIG_PCI_IOV)]
>> + pub fn physfn(&self) -> Result<&Device<device::Bound>> {
>> + if !self.is_virtfn() {
>> + return Err(EINVAL);
>> + }
>> + // SAFETY:
>> + // `self.as_raw` returns a valid pointer to a `struct pci_dev`.
>> + //
>> + // `physfn` is a valid pointer to a `struct pci_dev` since self.is_virtfn() is `true`.
>> + //
>> + // `physfn` may be cast to a `Device<device::Bound>` since `pci::Driver::remove()` calls
>> + // `disable_sriov()` to remove all VF devices, which guarantees that the underlying
>> + // PF device is always bound to a driver when the VF device is bound to a driver.
>
> Wrong safety statement. There are drivers that don't call
> disable_sriov(). You need to also check that the driver attached to
> the PF is actually working properly.
Indeed, with this patch, only Rust drivers provide this guarantee of the VF
being bound when the PF is bound.
> I do not like to see this attempt to open code the tricky login of
> pci_iov_get_pf_drvdata() in rust without understanding the issues :(
I discussed this with Peter in advance (thanks Peter for your work on this
topic!), and as mentioned above I'd like to see this series to propose that we
always guarantee that a VF is bound when the corresponding PF is bound.
With this, the above code will be correct and a driver can use the generic
infrastructure to:
1) Call pci::Device<Bound>::physfn() returning a Result<pci::Device<Bound>>
2) Grab the driver's device private data from the returned Device<Bound>
Note that 2) (i.e. accessing the driver's device private data with
Device::drvdata() [1]) ensures that the device is actually bound (drvdata() is
only implemented for Device<Bound>) and that the returned type actually matches
the type of the object that has been stored.
Since we always need those two checks when accessing a driver's device private
data, it is already done in the generic drvdata() accessor.
Therefore the only additional guarantee we have to give is that VF bound implies
PF bound. Otherwise physfn() would need to be unsafe and the driver would need
to promise that this is the case. From there on drvdata() already does the other
checks as mentioned.
I suggest to have a look at [2] for an example with how this turns out with the
auxiliary bus [2][3], since in the end it's the same problem, i.e. an auxiliary
driver calling into its parent, except that the auxiliary bus already guarantees
that the parent is bound when the child is bound.
Given that, there is no value in using pci_iov_get_pf_drvdata(), in Rust you'd
just call
// `vfdev` must be a `pci::Device<Bound>` for `physfn()` to be
// available; `pfdev` will therefore be a `pci::Device<Bound>` too
// (assuming we provide the guarantee for this, otherwise this would
// need to be unsafe).
let pfdev = vfdev.phyfn();
// `FooData` is the type of the PF drvier's device private data. The
// call to `drvdata()` will fail with an error of the asserted type is
// wrong.
let drvdata = pfdev.drvdata::<FooData>()?;
So, if we'd provide a Rust accessor for the PF's device driver data, we'd
implement it like above, because Device::drvdata() is already safe. If we want
pci::Device::pf_drvdata() to be safe, we'd otherwise need to do all the checks
Device::drvdata() already does again before we call into
pci_iov_get_pf_drvdata().
(Note that I'm currently travelling, hence I might not be as responsive as
usual. I'm travelling until after LPC; I plan to take a detailed look at this
series in the week of the conference).
[1] https://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git/tree/rust/kernel/device.rs?h=driver-core-next#n313
[2] https://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git/tree/samples/rust/rust_driver_auxiliary.rs?h=driver-core-next#n81
[3] https://lore.kernel.org/all/20251020223516.241050-1-dakr@kernel.org/
next prev parent reply other threads:[~2025-11-22 10:23 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-19 22:19 [PATCH 0/8] rust: pci: add abstractions for SR-IOV capability Peter Colberg
2025-11-19 22:19 ` [PATCH 1/8] rust: pci: add is_virtfn(), to check for VFs Peter Colberg
2025-11-21 3:00 ` kernel test robot
2025-11-21 18:27 ` Peter Colberg
2025-11-19 22:19 ` [PATCH 2/8] rust: pci: add is_physfn(), to check for PFs Peter Colberg
2025-11-21 4:35 ` kernel test robot
2025-11-19 22:19 ` [PATCH 3/8] rust: pci: add {enable,disable}_sriov(), to control SR-IOV capability Peter Colberg
2025-11-21 23:28 ` Jason Gunthorpe
2025-11-19 22:19 ` [PATCH 4/8] rust: pci: add num_vf(), to return number of VFs Peter Colberg
2025-11-19 22:19 ` [PATCH 5/8] rust: pci: add vtable attribute to pci::Driver trait Peter Colberg
2025-11-19 22:19 ` [PATCH 6/8] rust: pci: add bus callback sriov_configure(), to control SR-IOV from sysfs Peter Colberg
2025-11-21 6:00 ` kernel test robot
2025-11-19 22:19 ` [PATCH 7/8] rust: pci: add physfn(), to return PF device for VF device Peter Colberg
2025-11-21 7:57 ` kernel test robot
2025-11-21 23:26 ` Jason Gunthorpe
2025-11-22 10:23 ` Danilo Krummrich [this message]
2025-11-22 16:16 ` Jason Gunthorpe
2025-11-22 18:57 ` Leon Romanovsky
2025-11-22 22:26 ` Danilo Krummrich
2025-11-23 6:34 ` Leon Romanovsky
2025-11-23 10:07 ` Danilo Krummrich
2025-11-23 11:18 ` Leon Romanovsky
2025-11-22 22:43 ` Danilo Krummrich
2025-11-19 22:19 ` [PATCH 8/8] samples: rust: add SR-IOV driver sample Peter Colberg
2025-11-20 6:41 ` Zhi Wang
2025-11-20 15:49 ` Peter Colberg
2025-11-20 6:32 ` [PATCH 0/8] rust: pci: add abstractions for SR-IOV capability Zhi Wang
2025-11-20 15:03 ` Peter Colberg
2025-11-20 18:34 ` Zhi Wang
2025-11-20 21:16 ` Zhi Wang
2025-11-21 17:05 ` Peter Colberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DEF5EC79OOT4.2MT1ET4IKXS5Y@kernel.org \
--to=dakr@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=abdiel.janulgue@gmail.com \
--cc=acourbot@nvidia.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=apopple@nvidia.com \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=daniel.almeida@collabora.com \
--cc=david.m.ertman@intel.com \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=ira.weiny@intel.com \
--cc=jgg@ziepe.ca \
--cc=jhubbard@nvidia.com \
--cc=joelagnelf@nvidia.com \
--cc=kwilczynski@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=pcolberg@redhat.com \
--cc=robin.murphy@arm.com \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
--cc=zhiw@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).