All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Shameer Kolothum <skolothumtho@nvidia.com>
Cc: kvm@vger.kernel.org, linux-pci@vger.kernel.org,
	linux-kernel@vger.kernel.org, alex@shazbot.org, jgg@ziepe.ca,
	kevin.tian@intel.com, kbusch@meta.com,
	michal.winiarski@intel.com, satyanarayana.k.v.p@intel.com,
	sonangp@nvidia.com, ankita@nvidia.com, nathanc@nvidia.com,
	mochs@nvidia.com
Subject: Re: [RFC PATCH v3 02/20] PCI/PM: Add a power-state helper that tries the bus lock
Date: Thu, 12 Nov 2026 15:16:00 -0600	[thread overview]
Message-ID: <20261112211600.GA904814@bhelgaas> (raw)
In-Reply-To: <20261112141632.918954-3-skolothumtho@nvidia.com>

On Thu, Nov 12, 2026 at 02:16:14PM +0000, Shameer Kolothum wrote:
> PCI error recovery can hold pci_bus_sem for reading while waiting for a
> lock held by a driver. If that driver also needs the bus read lock to
> bring a device to D0, a queued writer can block it. Recovery, the driver
> and the writer then all wait for each other.
> 
> Add pci_try_set_power_state(), which returns -EAGAIN if it cannot take
> the bus lock immediately. The caller can then release its locks. Once
> the bus lock is held, use pci_set_power_state_locked() for the transition.
> Keep the existing cases that need no power-state change. The transition
> itself can still sleep.
> 
> Callers that already hold the bus read lock must use the locked helper
> instead.
> 
> Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>

Acked-by: Bjorn Helgaas <bhelgaas@google.com>

> ---
>  include/linux/pci.h |  3 +++
>  drivers/pci/pci.c   | 37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+)
> 
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index aa3765a20a96..542fa4af0a43 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1535,6 +1535,7 @@ int pci_load_and_free_saved_state(struct pci_dev *dev,
>  int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state);
>  int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
>  int pci_set_power_state_locked(struct pci_dev *dev, pci_power_t state);
> +int pci_try_set_power_state(struct pci_dev *dev, pci_power_t state);
>  pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
>  bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);
>  void pci_pme_active(struct pci_dev *dev, bool enable);
> @@ -2216,6 +2217,8 @@ static inline int pci_set_power_state(struct pci_dev *dev, pci_power_t state)
>  { return 0; }
>  static inline int pci_set_power_state_locked(struct pci_dev *dev, pci_power_t state)
>  { return 0; }
> +static inline int pci_try_set_power_state(struct pci_dev *dev, pci_power_t state)
> +{ return 0; }
>  static inline int pci_wake_from_d3(struct pci_dev *dev, bool enable)
>  { return 0; }
>  static inline pci_power_t pci_choose_state(struct pci_dev *dev,
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 7c6f2aba8144..f2ebd19204aa 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -1655,6 +1655,43 @@ int pci_set_power_state_locked(struct pci_dev *dev, pci_power_t state)
>  }
>  EXPORT_SYMBOL(pci_set_power_state_locked);
>  
> +/**
> + * pci_try_set_power_state - Set power state without waiting for the bus lock
> + * @dev: PCI device to handle
> + * @state: Target PCI power state
> + *
> + * Like pci_set_power_state(), but return -EAGAIN without changing the power
> + * state if the bus lock cannot be acquired immediately. The transition
> + * itself can sleep.
> + *
> + * Callers already holding the bus read lock must use
> + * pci_set_power_state_locked().
> + */
> +int pci_try_set_power_state(struct pci_dev *dev, pci_power_t state)
> +{
> +	int ret;
> +
> +	if (state > PCI_D3cold)
> +		state = PCI_D3cold;
> +	else if (state < PCI_D0)
> +		state = PCI_D0;
> +	else if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev))
> +		return 0;
> +
> +	if (dev->current_state == state)
> +		return 0;
> +	if (state >= PCI_D3hot && (dev->dev_flags & PCI_DEV_FLAGS_NO_D3))
> +		return 0;
> +
> +	if (!down_read_trylock(&pci_bus_sem))
> +		return -EAGAIN;
> +	ret = pci_set_power_state_locked(dev, state);
> +	up_read(&pci_bus_sem);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL(pci_try_set_power_state);
> +
>  #define PCI_EXP_SAVE_REGS	7
>  
>  static struct pci_cap_saved_state *_pci_find_saved_cap(struct pci_dev *pci_dev,
> -- 
> 2.43.0
> 

  parent reply	other threads:[~2026-11-12 21:16 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-12 14:16 [RFC PATCH v3 00/20] vfio/pci: Handle PCI error recovery and report state to userspace Shameer Kolothum
2026-11-12 14:16 ` [RFC PATCH v3 01/20] vfio/pci: Add SRCU-protected access ops Shameer Kolothum
2026-11-12 14:29   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 02/20] PCI/PM: Add a power-state helper that tries the bus lock Shameer Kolothum
2026-11-12 14:30   ` sashiko-bot
2026-11-12 21:16   ` Bjorn Helgaas [this message]
2026-11-12 14:16 ` [RFC PATCH v3 03/20] vfio/pci: Avoid waiting for the bus lock when preparing D0 Shameer Kolothum
2026-11-12 14:33   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 04/20] vfio/pci: Use access ops for config-space accesses Shameer Kolothum
2026-11-12 14:41   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 05/20] vfio/pci: Buffer ROM reads before copying to userspace Shameer Kolothum
2026-11-12 14:40   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 06/20] vfio/pci: Use access ops for BAR and ROM accesses Shameer Kolothum
2026-11-12 14:34   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 07/20] vfio/pci: Use access ops when mapping BAR pages Shameer Kolothum
2026-11-12 14:28   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 08/20] vfio/pci: Use access ops for hardware IRQ operations Shameer Kolothum
2026-11-12 14:30   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 09/20] vfio/pci: Use access ops for function reset Shameer Kolothum
2026-11-12 14:32   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 10/20] vfio/pci: Use access ops for runtime-PM requests Shameer Kolothum
2026-11-12 14:33   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 11/20] vfio/pci: Use access ops for hardware information queries Shameer Kolothum
2026-11-12 14:47   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 12/20] vfio/pci: Use access ops for DMA-BUF export and restoration Shameer Kolothum
2026-11-12 14:29   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 13/20] vfio/pci: Track PCI recovery state Shameer Kolothum
2026-11-12 14:35   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 14/20] vfio/pci: Add INTx recovery operations Shameer Kolothum
2026-11-12 14:52   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 15/20] vfio/pci: Use access ops for SR-IOV configuration and shared reset Shameer Kolothum
2026-11-12 14:49   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 16/20] vfio/pci: Restore device state from slot_reset() Shameer Kolothum
2026-11-12 14:50   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 17/20] vfio/pci: Complete recovery in resume() Shameer Kolothum
2026-11-12 14:45   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 18/20] vfio/pci: Block device access during host recovery Shameer Kolothum
2026-11-12 15:06   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 19/20] vfio/pci: Add VFIO_DEVICE_FEATURE_PCI_ERROR_RECOVERY Shameer Kolothum
2026-11-12 14:43   ` sashiko-bot
2026-11-12 14:16 ` [RFC PATCH v3 20/20] vfio/pci: Enable recovery for supported native PCIe endpoints Shameer Kolothum
2026-11-12 15:10   ` sashiko-bot

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=20261112211600.GA904814@bhelgaas \
    --to=helgaas@kernel.org \
    --cc=alex@shazbot.org \
    --cc=ankita@nvidia.com \
    --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=satyanarayana.k.v.p@intel.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.