All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex@shazbot.org>
To: <mhonap@nvidia.com>
Cc: <jgg@ziepe.ca>, <ankita@nvidia.com>, <jic23@kernel.org>,
	<dave.jiang@intel.com>, <alejandro.lucero-palau@amd.com>,
	<smadhavan@nvidia.com>, <corbet@lwn.net>,
	<skhan@linuxfoundation.org>, <dave@stgolabs.net>,
	<alison.schofield@intel.com>, <vishal.l.verma@intel.com>,
	<iweiny@kernel.org>, <ming.li@zohomail.com>, <yishaih@nvidia.com>,
	<skolothumtho@nvidia.com>, <kevin.tian@intel.com>,
	<bhelgaas@google.com>, <dmatlack@google.com>, <kees@kernel.org>,
	<gustavoars@kernel.org>, <cjia@nvidia.com>, <kjaju@nvidia.com>,
	<vsethi@nvidia.com>, <zhiw@nvidia.com>,
	<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<kvm@vger.kernel.org>, <linux-cxl@vger.kernel.org>,
	<linux-pci@vger.kernel.org>, <linux-kselftest@vger.kernel.org>,
	<linux-hardening@vger.kernel.org>,
	alex@shazbot.org
Subject: Re: [PATCH v6 05/31] PCI: Refuse bus and slot reset below a CXL port with SBR masked
Date: Wed, 4 Nov 2026 16:53:23 -0700	[thread overview]
Message-ID: <20261104165323.78b45467@shazbot.org> (raw)
In-Reply-To: <20261016161839.2765592-6-mhonap@nvidia.com>

On Fri, 16 Oct 2026 21:48:12 +0530
<mhonap@nvidia.com> wrote:

> From: Manish Honap <mhonap@nvidia.com>
> 
> A CXL port ignores the Secondary Bus Reset bit in Bridge Control unless
> Unmask SBR is set in its CXL Port DVSEC (CXL r4.0 sec 8.1.5.2).
> pci_reset_bus_function() already returns -ENOTTY in that case.
> pci_reset_bus(), pci_probe_reset_bus() and the slot variants do not, so
> they report success for a reset that reached no device below the port.
> 
> vfio-pci uses these for VFIO_DEVICE_GET_PCI_HOT_RESET_INFO and
> VFIO_DEVICE_PCI_HOT_RESET. A user is then told a hot reset happened while
> a CXL device below a masked port kept its state.
> 
> Return -ENOTTY from pci_probe_reset_slot() and pci_probe_reset_bus()
> when the bridge above the bus is a CXL port with SBR masked.
> pci_reset_bus() and pci_try_reset_bridge() probe before they reset, so
> they refuse too.
> 
> Users see this in three places:
> - the vfio hot reset ioctls fail (vfio reports -ENODEV when neither probe
>   succeeds),
> - the reset_subordinate sysfs attribute returns -ENOTTY,
> - vfio-pci groups a device in a hotplug slot below such a port by bus
>   instead of by slot.
> 
> Every other pci_reset_bus() caller, including the vfio bus reset at
> close, is refused the same way. With one device per CXL port both
> groupings have the same members.
> 
> Leave pci_bus_error_reset() as it is. AER and host bridge error recovery
> call it without saving or restoring state and only map its result to
> recovered or disconnect. Failing it below a masked port would turn
> recovery of every CXL device there, memory expanders included, into a
> disconnect; that is a CXL error handling decision, not part of this fix.
> 
> Assisted-by: LLM
> Signed-off-by: Manish Honap <mhonap@nvidia.com>
> ---
>  drivers/pci/pci.c | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index cecf8e681e69..87fe9de81acf 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -4984,6 +4984,20 @@ static bool cxl_sbr_masked(struct pci_dev *dev)
>  	return true;
>  }
>  
> +/*
> + * A secondary bus reset below a CXL port with SBR masked does not reach the
> + * devices on the bus, so a bus or slot reset there would report success for
> + * a reset that did not happen. The probes and the save/restore resets that
> + * pci_reset_bus() and reset_subordinate use refuse it; error recovery
> + * (pci_bus_error_reset()) keeps its existing behavior.
> + */

Reads like AI over-explaining a fairly obvious concept.

> +static bool pci_bus_cxl_sbr_masked(struct pci_bus *bus)
> +{
> +	struct pci_dev *bridge = bus->self;
> +
> +	return bridge && pcie_is_cxl(bridge) && cxl_sbr_masked(bridge);
> +}
> +
>  static int pci_reset_bus_function(struct pci_dev *dev, bool probe)
>  {
>  	struct pci_dev *bridge = pci_upstream_bridge(dev);
> @@ -5615,6 +5629,9 @@ static int pci_slot_reset(struct pci_slot *slot, bool probe)
>   */
>  int pci_probe_reset_slot(struct pci_slot *slot)
>  {
> +	if (slot && pci_bus_cxl_sbr_masked(slot->bus))
> +		return -ENOTTY;

Why would this be open coded here instead of pci_slot_resettable()?

> +
>  	return pci_slot_reset(slot, PCI_RESET_PROBE);
>  }
>  EXPORT_SYMBOL_GPL(pci_probe_reset_slot);
> @@ -5638,7 +5655,7 @@ static int pci_try_reset_slot(struct pci_slot *slot)
>  {
>  	int rc;
>  
> -	rc = pci_slot_reset(slot, PCI_RESET_PROBE);
> +	rc = pci_probe_reset_slot(slot);

Also suggests it's tested in the wrong place.

>  	if (rc)
>  		return rc;
>  
> @@ -5685,7 +5702,7 @@ static int pci_try_reset_bus(struct pci_bus *bus)
>  {
>  	int rc;
>  
> -	rc = pci_bus_reset(bus, PCI_RESET_PROBE);
> +	rc = pci_probe_reset_bus(bus);

And again.

>  	if (rc)
>  		return rc;
>  
> @@ -5726,8 +5743,13 @@ static int pci_reset_bridge(struct pci_dev *bridge, bool restore)
>  	if (list_empty(&bus->slots))
>  		goto bus_reset;
>  
> +	/*
> +	 * Probe without the CXL SBR mask check: error recovery keeps its
> +	 * reset path below a masked CXL port, and pci_try_reset_slot() and
> +	 * pci_try_reset_bus() refuse the restore path there.
> +	 */

More AI?  This function is not designated as exclusive to error
recovery.  If sbr is masked, slot reset doesn't generate an error and
doesn't effect a reset, regardless of who called it.  If we're including
a new condition for a bus/slot reset to be effective, it needs to be
applied universally.

>  	list_for_each_entry(slot, &bus->slots, list)
> -		if (pci_probe_reset_slot(slot))
> +		if (pci_slot_reset(slot, PCI_RESET_PROBE))
>  			goto bus_reset;
>  
>  	list_for_each_entry(slot, &bus->slots, list) {
> @@ -5773,6 +5795,9 @@ int pci_try_reset_bridge(struct pci_dev *bridge)
>   */
>  int pci_probe_reset_bus(struct pci_bus *bus)
>  {
> +	if (pci_bus_cxl_sbr_masked(bus))
> +		return -ENOTTY;
> +
>  	return pci_bus_reset(bus, PCI_RESET_PROBE);
>  }
>  EXPORT_SYMBOL_GPL(pci_probe_reset_bus);

Redux, pci_bus_resettable().  Thanks,

Alex

  reply	other threads:[~2026-11-04 23:55 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-16 16:18 [PATCH v6 00/31] vfio/pci: Add CXL Type-2 device passthrough support mhonap
2026-10-16 16:18 ` [PATCH v6 01/31] cxl/regs: Split the BAR block request and ioremap helpers mhonap
2026-10-16 16:18 ` [PATCH v6 02/31] cxl/regs: Let a BAR-owning driver own the component register block mhonap
2026-10-16 16:18 ` [PATCH v6 03/31] cxl: Move component register defines to uapi/cxl/cxl_regs.h mhonap
2026-11-04 23:52   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 04/31] PCI/CXL: Let the driver that owns the HDM range run CXL Reset mhonap
2026-11-04 23:54   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 05/31] PCI: Refuse bus and slot reset below a CXL port with SBR masked mhonap
2026-11-04 23:53   ` Alex Williamson [this message]
2026-10-16 16:18 ` [PATCH v6 06/31] vfio/pci: Add the CXL provider ops registration interface mhonap
2026-11-04 23:53   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 07/31] vfio/pci: Detect CXL devices and load the CXL provider on demand mhonap
2026-11-04 23:53   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 08/31] vfio/pci: Add a generic excluded-range list mhonap
2026-11-06 15:59   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 09/31] vfio/pci: Advertise the mmap areas around excluded ranges mhonap
2026-11-06 20:39   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 10/31] vfio/pci: Refuse ioeventfds and dma-buf exports over " mhonap
2026-11-06 20:52   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 11/31] vfio/pci: Virtualize the CXL DVSEC in vfio_pci_config.c mhonap
2026-11-06 22:10   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 12/31] vfio/pci: Call the CXL open and close hooks around device use mhonap
2026-11-06 22:51   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 13/31] vfio/pci: Bracket PCI resets with the CXL reset hooks mhonap
2026-11-06 23:44   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 14/31] vfio/pci: Provide an opt-out for the CXL Type-2 extensions mhonap
2026-10-16 16:18 ` [PATCH v6 15/31] vfio/pci: Route every reset point through a try-reset helper mhonap
2026-11-04 23:52   ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 16/31] vfio/pci: Revoke and re-arm one device-specific region mhonap
2026-10-16 16:18 ` [PATCH v6 17/31] vfio/pci: Call the device provider across low-power transitions mhonap
2026-10-16 16:18 ` [PATCH v6 18/31] vfio/cxl: Add the vfio-cxl provider module skeleton mhonap
2026-10-16 16:18 ` [PATCH v6 19/31] vfio/cxl: Create the CXL memdev and set media ready at bind mhonap
2026-10-16 16:18 ` [PATCH v6 20/31] vfio/cxl: Own the whole component register BAR mhonap
2026-10-16 16:18 ` [PATCH v6 21/31] vfio/cxl: Expose the HDM memory region to the guest mhonap
2026-10-16 16:18 ` [PATCH v6 22/31] vfio/cxl: Allow mmap of the HDM memory region mhonap
2026-10-16 16:18 ` [PATCH v6 23/31] vfio/cxl: Contain HDM memory errors with memory_failure() mhonap
2026-10-16 16:18 ` [PATCH v6 24/31] vfio/cxl: Expose the HDM decoder registers read-only to the guest mhonap
2026-10-16 16:18 ` [PATCH v6 25/31] vfio/cxl: Exclude the HDM decoder registers from direct BAR access mhonap
2026-10-16 16:18 ` [PATCH v6 26/31] vfio/cxl: Restore the HDM decoder after a hot reset mhonap
2026-10-16 16:18 ` [PATCH v6 27/31] vfio/cxl: Describe the CXL device and decoder geometry to userspace mhonap
2026-10-16 16:18 ` [PATCH v6 28/31] vfio/cxl: Export the HDM memory region as a dma-buf mhonap
2026-10-16 16:18 ` [PATCH v6 29/31] vfio/cxl: Run the CXL reset at the vfio reset points mhonap
2026-10-16 16:18 ` [PATCH v6 30/31] Documentation: vfio-pci: Document CXL Type-2 device passthrough mhonap
2026-10-16 16:18 ` [PATCH v6 31/31] selftests/vfio: Add CXL Type-2 passthrough tests mhonap

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=20261104165323.78b45467@shazbot.org \
    --to=alex@shazbot.org \
    --cc=alejandro.lucero-palau@amd.com \
    --cc=alison.schofield@intel.com \
    --cc=ankita@nvidia.com \
    --cc=bhelgaas@google.com \
    --cc=cjia@nvidia.com \
    --cc=corbet@lwn.net \
    --cc=dave.jiang@intel.com \
    --cc=dave@stgolabs.net \
    --cc=dmatlack@google.com \
    --cc=gustavoars@kernel.org \
    --cc=iweiny@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=jic23@kernel.org \
    --cc=kees@kernel.org \
    --cc=kevin.tian@intel.com \
    --cc=kjaju@nvidia.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mhonap@nvidia.com \
    --cc=ming.li@zohomail.com \
    --cc=skhan@linuxfoundation.org \
    --cc=skolothumtho@nvidia.com \
    --cc=smadhavan@nvidia.com \
    --cc=vishal.l.verma@intel.com \
    --cc=vsethi@nvidia.com \
    --cc=yishaih@nvidia.com \
    --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 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.