From: "Danilo Krummrich" <dakr@kernel.org>
To: "Simon Song" <xinmengs@nvidia.com>
Cc: <acourbot@nvidia.com>, <kvm@vger.kernel.org>,
<rust-for-linux@vger.kernel.org>, <nova-gpu@lists.linux.dev>,
<linux-pci@vger.kernel.org>, <alex@shazbot.org>, <jgg@nvidia.com>,
<yishaih@nvidia.com>, <skolothumtho@nvidia.com>,
<kevin.tian@intel.com>, <airlied@gmail.com>, <simona@ffwll.ch>,
<ojeda@kernel.org>, <alex.gaynor@gmail.com>,
<boqun.feng@gmail.com>, <gary@garyguo.net>,
<bjorn3_gh@protonmail.com>, <lossin@kernel.org>,
<a.hindborg@kernel.org>, <aliceryhl@google.com>,
<tmgross@umich.edu>, <jhubbard@nvidia.com>,
<ecourtney@nvidia.com>, <cjia@nvidia.com>, <smitra@nvidia.com>,
<kjaju@nvidia.com>, <alkumar@nvidia.com>, <ankita@nvidia.com>,
<aniketa@nvidia.com>, <kwankhede@nvidia.com>,
<targupta@nvidia.com>, <linux-kernel@vger.kernel.org>,
<zhiwang@kernel.org>, <zhiw@nvidia.com>, <boqun@kernel.org>,
<daniel.almeida@collabora.com>, <tamird@kernel.org>,
<work@onurozkan.dev>, <jgg@ziepe.ca>, <bhelgaas@google.com>,
<kwilczynski@kernel.org>, <dri-devel@lists.freedesktop.org>,
<peter@colberg.org>
Subject: Re: [PATCH v2 05/12] rust: pci: add reset callbacks
Date: Tue, 10 Nov 2026 00:19:26 +0100 [thread overview]
Message-ID: <DMR2CDPKE6SD.3KQ0GKUHG2HZ7@kernel.org> (raw)
In-Reply-To: <20261023154009.2246627-6-xinmengs@nvidia.com>
On Fri Oct 23, 2026 at 5:40 PM CEST, Simon Song wrote:
> @@ -175,6 +178,61 @@ extern "C" fn remove_callback(pdev: *mut bindings::pci_dev) {
> // Drop private data before returning to PCI core, while its removal context is valid.
> drop(data);
> }
> +
> + /// # Safety
> + ///
> + /// `dev` must belong to `T`. Any installed driver data must remain installed until this
> + /// call returns. The data lifetime is independent of the callback borrow.
> + unsafe fn callback_data_with<R>(
> + dev: *mut bindings::device,
> + f: impl for<'borrow, 'data> FnOnce(Pin<&'borrow T::Data<'data>>) -> R,
> + ) -> Option<R> {
> + // SAFETY: The callback supplies a device bound to `T`.
> + let data = unsafe { bindings::dev_get_drvdata(dev) };
> + if data.is_null() {
> + return None;
> + }
> + // SAFETY: PCI installed pinned `T::Data`; the caller excludes its removal.
> + Some(f(unsafe {
> + Pin::new_unchecked(&*data.cast::<T::Data<'_>>())
> + }))
> + }
This isn't needed, you can just use Device::drvdata_borrow() below.
> +
> + extern "C" fn reset_prepare_callback(pdev: *mut bindings::pci_dev) {
> + // SAFETY: PCI holds the device lock throughout reset.
> + let dev = unsafe { &*pdev.cast::<Device<device::CoreInternal<'_>>>() };
> + // SAFETY: The device lock prevents removal of installed driver data.
> + let _ = unsafe {
> + Self::callback_data_with(&raw mut (*pdev).dev, |data| T::reset_prepare(dev, data))
> + };
> + }
> +
> + extern "C" fn reset_done_callback(pdev: *mut bindings::pci_dev) {
> + // SAFETY: PCI holds the device lock throughout reset.
> + let dev = unsafe { &*pdev.cast::<Device<device::CoreInternal<'_>>>() };
> + // SAFETY: The device lock prevents removal of installed driver data.
> + let _ = unsafe {
> + Self::callback_data_with(&raw mut (*pdev).dev, |data| T::reset_done(dev, data))
Here and above closure isn't needed, you can just use Device::drvdata_borrow().
> + };
> + }
> +
> + const ERROR_HANDLERS: bindings::pci_error_handlers = bindings::pci_error_handlers {
> + error_detected: None,
> + mmio_enabled: None,
> + slot_reset: None,
> + reset_prepare: if T::HAS_RESET_PREPARE {
> + Some(Self::reset_prepare_callback)
> + } else {
> + None
> + },
> + reset_done: if T::HAS_RESET_DONE {
> + Some(Self::reset_done_callback)
> + } else {
> + None
> + },
> + resume: None,
> + cor_error_detected: None,
> + };
> }
>
> /// Declares a kernel module that exposes a single PCI driver.
> @@ -375,6 +433,18 @@ fn unbind<'bound>(dev: &'bound Device<device::Core<'_>>, this: Pin<&Self::Data<'
> let _ = (dev, this);
> }
>
> + /// Called before a PCI function reset, with the device lock held.
> + fn reset_prepare<'bound>(dev: &Device<device::Core<'_>>, this: Pin<&Self::Data<'bound>>) {
> + let _ = (dev, this);
> + build_error!(crate::error::VTABLE_DEFAULT_ERROR)
> + }
> +
> + /// Called after a PCI function reset, with the device lock held.
> + fn reset_done<'bound>(dev: &Device<device::Core<'_>>, this: Pin<&Self::Data<'bound>>) {
> + let _ = (dev, this);
> + build_error!(crate::error::VTABLE_DEFAULT_ERROR)
> + }
This can both use #[optional].
(You can leave unbind() alone, I want to remove it anyways.)
> +
> /// Enables Single Root I/O Virtualization (SR-IOV) for a PF.
> ///
> /// Called when userspace writes a nonzero VF count to `sriov_numvfs`. The token carries the
> diff --git a/rust/kernel/vfio/pci.rs b/rust/kernel/vfio/pci.rs
> index 43c14b4e3a1..db30dbce6a8 100644
> --- a/rust/kernel/vfio/pci.rs
> +++ b/rust/kernel/vfio/pci.rs
> @@ -1084,6 +1084,18 @@ unsafe fn unregister(&self) {
> // VGA and runtime PM callbacks. No field of the enclosing data is being destroyed.
> unsafe { bindings::vfio_pci_core_unregister_device(self.dev.core_device()) };
> }
> +
> + /// Prepare the variant driver's state for a PCI reset.
> + pub fn reset_prepare(&self) {
> + // SAFETY: This owner keeps the pinned registration data alive.
> + unsafe { self.dev.registration_data_with(T::reset_prepare) };
> + }
> +
> + /// Complete the variant driver's state update after a PCI reset.
> + pub fn reset_done(&self) -> Result {
> + // SAFETY: This owner keeps the pinned registration data alive.
> + unsafe { self.dev.registration_data_with(T::reset_done) }
> + }
The unsafe accessor of self.dev shouldn't be needed. You can just call
T::reset_done(self.reg_data)
next prev parent reply other threads:[~2026-11-09 23:19 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-23 15:39 [PATCH v2 00/12] Rust VFIO PCI support and NVIDIA vGPU driver Simon Song
2026-10-23 15:39 ` [PATCH v2 01/12] rust: pci: add VFIO override device IDs Simon Song
2026-10-23 20:07 ` Gary Guo
2026-10-30 20:34 ` Simon Song
2026-10-23 15:39 ` [PATCH v2 02/12] rust: pci: expose the VF index within its PF Simon Song
2026-11-09 22:17 ` Danilo Krummrich
2026-10-23 15:39 ` [PATCH v2 03/12] rust: pci: allow drivers to manage DMA ownership Simon Song
2026-11-09 22:18 ` Danilo Krummrich
2026-10-23 15:39 ` [PATCH v2 04/12] rust: vfio: add PCI variant driver abstractions Simon Song
2026-10-23 15:40 ` [PATCH v2 05/12] rust: pci: add reset callbacks Simon Song
2026-11-09 23:19 ` Danilo Krummrich [this message]
2026-10-23 15:40 ` [PATCH v2 06/12] rust: pci: add a bind callback after installing driver data Simon Song
2026-11-10 0:10 ` Danilo Krummrich
2026-10-23 15:40 ` [PATCH v2 07/12] rust: pci: add an error_detected callback Simon Song
2026-11-10 0:47 ` Danilo Krummrich
2026-10-23 15:40 ` [PATCH v2 08/12] rust: pci: add runtime PM callbacks Simon Song
2026-11-10 0:23 ` Danilo Krummrich
2026-10-23 15:40 ` [PATCH v2 09/12] rust: vfio: use the PCI adapter for variant drivers Simon Song
2026-10-23 15:40 ` [PATCH v2 10/12] rust: vfio: separate common device handling from PCI Simon Song
2026-11-10 19:44 ` Danilo Krummrich
2026-10-23 15:40 ` [PATCH v2 11/12] gpu: nova-core: publish typed SR-IOV PF APIs Simon Song
2026-11-10 15:50 ` Danilo Krummrich
2026-10-23 15:40 ` [PATCH v2 12/12] vfio/nvidia-vgpu: add the Rust VFIO variant driver Simon Song
2026-10-30 20:40 ` [PATCH v2 00/12] Rust VFIO PCI support and NVIDIA vGPU driver Simon Song
2026-10-30 20:49 ` Danilo Krummrich
2026-11-10 1:04 ` Danilo Krummrich
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=DMR2CDPKE6SD.3KQ0GKUHG2HZ7@kernel.org \
--to=dakr@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=alex.gaynor@gmail.com \
--cc=alex@shazbot.org \
--cc=aliceryhl@google.com \
--cc=alkumar@nvidia.com \
--cc=aniketa@nvidia.com \
--cc=ankita@nvidia.com \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=boqun@kernel.org \
--cc=cjia@nvidia.com \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ecourtney@nvidia.com \
--cc=gary@garyguo.net \
--cc=jgg@nvidia.com \
--cc=jgg@ziepe.ca \
--cc=jhubbard@nvidia.com \
--cc=kevin.tian@intel.com \
--cc=kjaju@nvidia.com \
--cc=kvm@vger.kernel.org \
--cc=kwankhede@nvidia.com \
--cc=kwilczynski@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=ojeda@kernel.org \
--cc=peter@colberg.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=skolothumtho@nvidia.com \
--cc=smitra@nvidia.com \
--cc=tamird@kernel.org \
--cc=targupta@nvidia.com \
--cc=tmgross@umich.edu \
--cc=work@onurozkan.dev \
--cc=xinmengs@nvidia.com \
--cc=yishaih@nvidia.com \
--cc=zhiw@nvidia.com \
--cc=zhiwang@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.