From: "K V P, Satyanarayana" <satyanarayana.k.v.p@intel.com>
To: Shameer Kolothum <skolothumtho@nvidia.com>, <kvm@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <alex@shazbot.org>, <jgg@ziepe.ca>, <kevin.tian@intel.com>,
<kbusch@meta.com>, <michal.winiarski@intel.com>,
<sonangp@nvidia.com>, <nathanc@nvidia.com>, <mochs@nvidia.com>
Subject: Re: [RFC PATCH 04/19] vfio/pci: Serialize function reset with recovery
Date: Wed, 2 Sep 2026 11:36:22 +0530 [thread overview]
Message-ID: <3ceaf230-c06e-479e-80c5-8517dbc1710a@intel.com> (raw)
In-Reply-To: <20260901093217.8539-5-skolothumtho@nvidia.com>
On 01-Sep-26 3:02 PM, Shameer Kolothum wrote:
> Add a function reset helper and use it for VFIO_DEVICE_RESET. A later
> patch routes the guest triggered config space FLR through it as well.
> That path never did the power state transition, so make it optional.
>
> With recovery enabled, take recovery_lock for writing, refuse the reset
> with -EBUSY if access is already blocked, otherwise block access and drop
> the lock again before revoking mappings or running the reset.
> recovery_lock cannot be held across the reset because a reset method can
> take pci_bus_sem, and the PCI error callbacks take recovery_lock from
> under it.
>
> Dropping it is safe in both directions. The error callbacks hold
> recovery_lock for their whole body, so one already running has finished
> before the reset starts. One which arrives while the lock is down runs
> its own event, and the PCI core calls it with the device lock held, which
> pci_try_reset_function() also takes, so it cannot overlap the reset
> itself.
>
> Only unblock access at the end for a reset which is still the one
> blocking it. An event which started meanwhile owns the state from then
> on, and resume() is what ends it.
>
> With recovery not enabled, leave access_blocked alone. Two concurrent
> resets still serialize on memory_lock, same as today. Setting the flag
> for a device which never opted in would turn a working VFIO_DEVICE_RESET
> into -EBUSY.
>
> Access stays blocked until the reset is done and memory state is back,
> and the wait queue is woken once it clears. A later patch adds the BAR
> fault path, which waits there rather than failing the fault while a
> reset is in flight.
>
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
> ---
> drivers/vfio/pci/vfio_pci_priv.h | 3 ++
> drivers/vfio/pci/vfio_pci_core.c | 85 +++++++++++++++++++++++++++++---
> 2 files changed, 82 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_priv.h b/drivers/vfio/pci/vfio_pci_priv.h
> index 6daf51669d05..8a7f9fe22386 100644
> --- a/drivers/vfio/pci/vfio_pci_priv.h
> +++ b/drivers/vfio/pci/vfio_pci_priv.h
> @@ -41,6 +41,9 @@ ssize_t vfio_pci_config_rw_single(struct vfio_pci_core_device *vdev,
> char __user *buf, size_t count, loff_t *ppos,
> bool iswrite);
>
> +int vfio_pci_try_reset_function(struct vfio_pci_core_device *vdev,
> + bool reset_power_state);
> +
> ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf,
> size_t count, loff_t *ppos, bool iswrite);
>
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index 4194d44d6530..3645daa8891f 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -1379,14 +1379,53 @@ static int vfio_pci_ioctl_set_irqs(struct vfio_pci_core_device *vdev,
> return ret;
> }
>
> -static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> - void __user *arg)
> +int vfio_pci_try_reset_function(struct vfio_pci_core_device *vdev,
> + bool reset_power_state)
> {
> + struct pci_dev *pdev = vdev->pdev;
> + bool enabled = false;
> + bool supported = vdev->pci_recovery_supported;
Can we use a helper function to get pci recovery is supported or not?
Maintainability will be easy with helper function than direct assignment.
-Satya.
> int ret;
>
> - if (!vdev->reset_works)
> - return -EINVAL;
> + /*
> + * Claim the device against recovery before resetting it. The PCI
> + * error callbacks hold recovery_lock for their whole body, so taking
> + * it for writing here waits for one already running, and
> + * access_blocked keeps a later one away while the lock is dropped.
> + */
> + if (supported) {
> + down_write(&vdev->recovery_lock);
> + if (!vdev->pci_recovery_device_open) {
> + ret = -ENODEV;
> + goto out_recovery;
> + }
>
> + enabled = vdev->pci_recovery_enabled;
> +
> + /*
> + * Only claim access_blocked when recovery is enabled.
> + * error_detected() returns early for a device which has not
> + * enabled it, so there is nothing to exclude, and claiming it
> + * anyway would fail the second of two concurrent
> + * VFIO_DEVICE_RESET calls with -EBUSY.
> + */
> + if (enabled) {
> + if (vdev->pci_recovery_access_blocked) {
> + ret = -EBUSY;
> + goto out_recovery;
> + }
> + WRITE_ONCE(vdev->pci_recovery_access_blocked, true);
> + }
> + up_write(&vdev->recovery_lock);
> + }
> +
> + /*
> + * On a device which supports recovery, taking recovery_lock for
> + * writing above waited for anything already past its access check,
> + * and if recovery is enabled access_blocked keeps new ones out. Do
> + * not hold recovery_lock while taking memory_lock or running a reset
> + * method, since a reset can take pci_bus_sem.
> + */
> vfio_pci_zap_and_down_write_memory_lock(vdev);
>
> /*
> @@ -1398,15 +1437,49 @@ static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> * reset without restoring the original state (saved locally in
> * 'vdev->pm_save').
> */
> - vfio_pci_set_power_state(vdev, PCI_D0);
> + if (reset_power_state)
> + vfio_pci_set_power_state(vdev, PCI_D0);
>
> vfio_pci_dma_buf_move(vdev, true);
> - ret = pci_try_reset_function(vdev->pdev);
> + ret = pci_try_reset_function(pdev);
> if (__vfio_pci_memory_enabled(vdev))
> vfio_pci_dma_buf_move(vdev, false);
> up_write(&vdev->memory_lock);
>
> + if (enabled) {
> + down_write(&vdev->recovery_lock);
> + /*
> + * An error callback can have started an event while the lock
> + * was down. Leave the state to it. Only unblock access for a
> + * reset which is still the one holding it.
> + */
> + if (vdev->pci_recovery_device_open &&
> + !(vdev->pci_recovery_flags & (VFIO_PCI_RECOVERY_IN_PROGRESS |
> + VFIO_PCI_RECOVERY_FAILED)))
> + WRITE_ONCE(vdev->pci_recovery_access_blocked, false);
> + up_write(&vdev->recovery_lock);
> + /*
> + * Access is blocked for the length of the reset, so anything
> + * waiting for it to clear has to be woken here. A later patch
> + * adds the BAR fault path which waits on this.
> + */
> + wake_up_all(&vdev->pci_recovery_wait);
> + }
> +
> return ret;
> +
> +out_recovery:
> + up_write(&vdev->recovery_lock);
> + return ret;
> +}
> +
> +static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> + void __user *arg)
> +{
> + if (!vdev->reset_works)
> + return -EINVAL;
> +
> + return vfio_pci_try_reset_function(vdev, true);
> }
>
> static int vfio_pci_ioctl_get_pci_hot_reset_info(
next prev parent reply other threads:[~2026-09-02 6:06 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 9:31 [RFC PATCH 00/19] vfio/pci: Handle PCI error recovery and report state to userspace Shameer Kolothum
2026-09-01 9:31 ` [RFC PATCH 01/19] vfio/pci: Add PCI error recovery support state Shameer Kolothum
2026-09-01 9:45 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 02/19] vfio/pci: Serialize generic device lifetime with recovery Shameer Kolothum
2026-09-01 9:47 ` sashiko-bot
2026-09-01 13:14 ` K V P, Satyanarayana
2026-09-01 13:37 ` Shameer Kolothum Thodi
2026-09-01 9:32 ` [RFC PATCH 03/19] vfio/pci: Add PCI recovery access guards Shameer Kolothum
2026-09-01 9:39 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 04/19] vfio/pci: Serialize function reset with recovery Shameer Kolothum
2026-09-01 9:45 ` sashiko-bot
2026-09-02 6:06 ` K V P, Satyanarayana [this message]
2026-09-03 11:20 ` Shameer Kolothum Thodi
2026-09-01 9:32 ` [RFC PATCH 05/19] vfio/pci: Serialize config access " Shameer Kolothum
2026-09-01 9:46 ` sashiko-bot
2026-09-02 6:27 ` K V P, Satyanarayana
2026-09-03 11:08 ` Shameer Kolothum Thodi
2026-09-01 9:32 ` [RFC PATCH 06/19] vfio/pci: Serialize ioeventfd writes " Shameer Kolothum
2026-09-01 9:43 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 07/19] vfio/pci: Retry BAR faults after temporary recovery Shameer Kolothum
2026-09-01 9:47 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 08/19] vfio/pci: Serialize BAR and ROM access with recovery Shameer Kolothum
2026-09-01 9:48 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 09/19] vfio/pci: Serialize interrupt operations " Shameer Kolothum
2026-09-01 9:42 ` sashiko-bot
2026-09-03 6:34 ` K V P, Satyanarayana
2026-09-03 10:39 ` Shameer Kolothum Thodi
2026-09-01 9:32 ` [RFC PATCH 10/19] vfio/pci: Serialize hot reset " Shameer Kolothum
2026-09-01 9:58 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 11/19] vfio/pci: Serialize runtime PM " Shameer Kolothum
2026-09-01 9:49 ` sashiko-bot
2026-09-03 6:43 ` K V P, Satyanarayana
2026-09-03 10:47 ` Shameer Kolothum Thodi
2026-09-01 9:32 ` [RFC PATCH 12/19] vfio/pci: Serialize physical device information queries " Shameer Kolothum
2026-09-01 9:48 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 13/19] vfio/pci: Serialize DMA-BUF export " Shameer Kolothum
2026-09-01 9:43 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 14/19] vfio/pci: Add generic PCI error slot reset handling Shameer Kolothum
2026-09-01 9:53 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 15/19] vfio/pci: Add INTx helpers for PCI recovery Shameer Kolothum
2026-09-01 9:59 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 16/19] vfio/pci: Quiesce INTx during " Shameer Kolothum
2026-09-01 9:53 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 17/19] vfio/pci: Add generic PCI error resume handling Shameer Kolothum
2026-09-01 9:55 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 18/19] vfio/pci: Coordinate generic device access with host recovery Shameer Kolothum
2026-09-01 9:56 ` sashiko-bot
2026-09-01 9:32 ` [RFC PATCH 19/19] vfio/pci: Expose and enable host PCI error recovery Shameer Kolothum
2026-09-01 9:56 ` sashiko-bot
2026-09-04 19:09 ` [RFC PATCH 00/19] vfio/pci: Handle PCI error recovery and report state to userspace Alex Williamson
2026-09-07 9:38 ` Shameer Kolothum Thodi
2026-09-08 10:58 ` Shameer Kolothum Thodi
2026-09-08 21:41 ` Alex Williamson
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=3ceaf230-c06e-479e-80c5-8517dbc1710a@intel.com \
--to=satyanarayana.k.v.p@intel.com \
--cc=alex@shazbot.org \
--cc=jgg@ziepe.ca \
--cc=kbusch@meta.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=michal.winiarski@intel.com \
--cc=mochs@nvidia.com \
--cc=nathanc@nvidia.com \
--cc=skolothumtho@nvidia.com \
--cc=sonangp@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 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.