From: Lukas Wunner <lukas@wunner.de>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: Bjorn Helgaas <helgaas@kernel.org>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org
Subject: Re: PCI resource allocation mismatch with BIOS
Date: Tue, 29 Nov 2022 07:48:12 +0100 [thread overview]
Message-ID: <20221129064812.GA1555@wunner.de> (raw)
In-Reply-To: <20221128150617.14c98c2e.alex.williamson@redhat.com>
On Mon, Nov 28, 2022 at 03:06:17PM -0700, Alex Williamson wrote:
> Agreed. Is this convoluted removal process being used to force a SBR,
> versus a FLR or PM reset that might otherwise be used by twiddling the
> reset attribute of the GPU directly? If so, the reset_method attribute
> can be used to force a bus reset and perform all the state save/restore
> handling to avoid reallocating BARs. A reset from the upstream switch
> port would only be necessary if you have some reason to also reset the
> switch downstream ports. Thanks,
A Secondary Bus Reset is only offered as a reset_method if the
device to be reset is the *only* child of the upstream bridge.
I.e. if the device to be reset has siblings or children,
a Secondary Bus Reset is not permitted.
Modern GPUs (including the one Mika is referring to) consist of
a PCIe switch with the GPU, HD audio and telemetry devices below
Downstream Bridges. A Secondary Bus Reset of the Root Port is
not allowed in this case because the Switch Upstream Port has
children.
See this code in pci_parent_bus_reset():
if (pci_is_root_bus(dev->bus) || dev->subordinate ||
!dev->bus->self || dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)
return -ENOTTY;
The dev->subordinate check disallows a SBR if there are children.
Note that the code should probably instead check for...
(dev->subordinate && !list_empty(dev->subordinate->devices))
...because the port may have a subordinate bus without children
(may have been removed for example).
The "no siblings" rule is enforced by:
list_for_each_entry(pdev, &dev->bus->devices, bus_list)
if (pdev != dev)
return -ENOTTY;
Note that the devices list is iterated without holding pci_bus_sem,
which looks fishy.
That said, it *is* possible that a Secondary Bus Reset is erroneously
offered despite these checks because we perform them early on device
enumeration when the subordinate bus hasn't been scanned yet.
So if the Root Port offers other reset methods besides SBR and the
user switches to one of them, then reinstates the defaults,
suddenly SBR will disappear because the subordinate bus has since
been scanned. What's missing here is that we re-check availability
of the reset methods on siblings and the parent when a device is
added or removed. This is also necessary to make reset_method
work properly with hotplug. However, the result may be that the
reset_method attribute in sysfs may become invisible after adding
a device (because there is no reset method available) and reappear
after removing a device.
So the reset_method logic is pretty broken right now I'm afraid.
In any case, for Mika's use case it would be useful to have a
"reset_subordinate" attribute on ports capable of a SBR such that
the entire hierarchy below is reset. The "reset" attribute is
insufficient.
Thanks,
Lukas
next prev parent reply other threads:[~2022-11-29 6:48 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-28 11:14 PCI resource allocation mismatch with BIOS Mika Westerberg
2022-11-28 20:39 ` Bjorn Helgaas
2022-11-28 22:06 ` Alex Williamson
2022-11-29 6:48 ` Lukas Wunner [this message]
2022-11-29 10:09 ` Mika Westerberg
2022-11-29 13:52 ` Alex Williamson
2022-11-29 15:07 ` Mika Westerberg
2022-11-29 15:46 ` Alex Williamson
2022-11-29 16:06 ` Lukas Wunner
2022-11-29 16:12 ` Alex Williamson
2022-11-30 7:43 ` Lukas Wunner
2022-11-30 7:57 ` Mika Westerberg
2022-11-30 15:47 ` Alex Williamson
2022-12-01 9:41 ` Mika Westerberg
2022-12-09 11:08 ` Mika Westerberg
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=20221129064812.GA1555@wunner.de \
--to=lukas@wunner.de \
--cc=alex.williamson@redhat.com \
--cc=bhelgaas@google.com \
--cc=helgaas@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mika.westerberg@linux.intel.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