From: Bjorn Helgaas <helgaas@kernel.org>
To: Lukas Wunner <lukas@wunner.de>
Cc: stuart hayes <stuart.w.hayes@gmail.com>,
Krzysztof Wilczy??ski <kw@linux.com>,
Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org
Subject: Re: [PATCH v2] PCI/portdrv: Use link bandwidth notification capability bit
Date: Wed, 1 Sep 2021 16:28:50 -0500 [thread overview]
Message-ID: <20210901212850.GA242902@bjorn-Precision-5520> (raw)
In-Reply-To: <20210901054818.GA7877@wunner.de>
On Wed, Sep 01, 2021 at 07:48:18AM +0200, Lukas Wunner wrote:
> On Tue, Aug 31, 2021 at 04:58:01PM -0500, Bjorn Helgaas wrote:
> > I just think it's
> > conceivable that one might *want* portdrv to not claim an intermediate
> > switch like that.
>
> It's possible to manually unbind portdrv from the device via sysfs
> (because portdrv is a driver). In that case the port will not restore
> config space upon an error-induced reset and any devices downstream
> of the port will be inaccessible after the reset.
>
> That's the only possible way to screw this up I think.
> And it requires deliberate, manual action. One *could* argue that's
> not correct and the kernel shouldn't allow the incorrect behavior
> in the first place. The behavior follows from portdrv being a driver,
> instead of its functionality being baked into the PCI core.
Right. I do think the overall PCI design would be significantly
cleaner if the portdrv functionality were baked into the PCI core
instead of being a driver.
> > Or maybe you don't have portdrv configured at all. Do we still
> > save/restore config space for suspend/resume of the switch?
>
> We do, because the PCI core takes care of that. E.g. on resume
> from system sleep:
>
> pci_pm_resume_noirq()
> pci_pm_default_resume_early()
> pci_restore_state()
>
> However after an error-induced reset, it's the job of the device
> driver's ->slot_reset() callback to restore config space.
> That's a design decision that was made back in 2005 when EEH
> was introduced. See Documentation/PCI/pci-error-recovery.rst:
>
> It is important for the platform to restore the PCI config space
> to the "fresh poweron" state, rather than the "last state". After
> a slot reset, the device driver will almost always use its standard
> device initialization routines, and an unusual config space setup
> may result in hung devices, kernel panics, or silent data corruption.
>
> I guess it would be possible to perform certain tasks such as
> pci_restore_state() centrally in report_slot_reset() instead
> (in drivers/pci/pcie/err.c) and alleviate each driver from doing that.
>
> One has to bear in mind though that a device may require specific
> steps before pci_restore_state() is called. E.g. in the case of
> portdrv, spurious hotplug DLLSC events need to be acknowledged
> first:
>
> https://patchwork.ozlabs.org/project/linux-pci/patch/251f4edcc04c14f873ff1c967bc686169cd07d2d.1627638184.git.lukas@wunner.de/
As far as I know, pci_restore_state() only restores things specified
by the PCIe spec. It doesn't restore any device-specific state, so
I'm a little hesitant about inserting device-specific things in the
middle of that flow. I know you're solving a real problem with that
patch, and I don't have any better suggestions, but it will take me a
while to assimilate this.
Thanks for all your analysis; it is very helpful!
> If portdrv isn't configured at all, AER and DPC support cannot be
> configured either (because they depend on PCIEPORTBUS), and it's the
> reset performed by AER or DPC which necessitates calling pci_restore_state().
>
> If a port supports none of portdrv's services, portdrv still binds to
> the port and is thus able to restore config space if a reset is performed
> at a port further upstream. That's because of ...
>
> if (!capabilities)
> return 0;
>
> ... in pcie_port_device_register(). So that should be working correctly.
>
> Thanks,
>
> Lukas
next prev parent reply other threads:[~2021-09-01 21:28 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-12 21:33 [PATCH v2] PCI/portdrv: Use link bandwidth notification capability bit Stuart Hayes
2021-05-14 13:03 ` Krzysztof Wilczyński
2021-05-14 13:08 ` Lukas Wunner
2021-05-14 13:17 ` Krzysztof Wilczy??ski
2021-05-27 1:12 ` stuart hayes
2021-07-07 15:48 ` stuart hayes
2021-07-07 18:59 ` Bjorn Helgaas
2021-08-31 19:20 ` Bjorn Helgaas
2021-08-31 21:39 ` stuart hayes
2021-08-31 21:58 ` Bjorn Helgaas
2021-09-01 5:48 ` Lukas Wunner
2021-09-01 21:28 ` Bjorn Helgaas [this message]
2021-07-16 21:56 ` Bjorn Helgaas
2021-07-17 2:43 ` stuart hayes
2021-08-31 19:11 ` Bjorn Helgaas
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=20210901212850.GA242902@bjorn-Precision-5520 \
--to=helgaas@kernel.org \
--cc=bhelgaas@google.com \
--cc=kw@linux.com \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=stuart.w.hayes@gmail.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