From: Alan Stern <stern@rowland.harvard.edu>
To: Laurence Oberman <loberman@redhat.com>
Cc: linux-usb@vger.kernel.org, andriy.shevchenko@linux.intel.com,
stable@vger.kernel.org, emilne@redhat.com, djeffery@redhat.com,
apanagio@redhat.com, torez@redhat.com
Subject: Re: [PATCH] usb: hcd: Revert 306c54d0edb6ba94d39877524dddebaad7770cf2: Try MSI interrupts on PCI devices
Date: Tue, 13 Jul 2021 15:15:48 -0400 [thread overview]
Message-ID: <20210713191548.GD355405@rowland.harvard.edu> (raw)
In-Reply-To: <1626202242-14984-1-git-send-email-loberman@redhat.com>
On Tue, Jul 13, 2021 at 02:50:42PM -0400, Laurence Oberman wrote:
> Customers have been reporting that the I/O is radically being
> slowed down to HPE virtual USB ILO served DVD images during installation.
>
> Lots of investigation by the Red Hat lab has found that the issue is
> because MSI edge interrupts do not work properly for these
> ILO USB devices.
> We start fast and then drop to polling mode and its unusable.
>
> The issue exists currently upstream on 5.13 as tested by Red Hat,
> and reverting the mentioned patch corrects this upstream.
>
> David Jeffery has this explanation:
>
> The problem with the patch turning on MSI appears to be that the ehci
> driver (and possibly other usb controller types too) wasn't written to
> support edge-triggered interrupts.
> The ehci_irq routine appears to be written in such a way that it will
> be racy with multiple interrupt source bits.
> With a level-triggered interrupt, it gets called another time and cleans
> up other interrupt sources.
> But with MSI edge, the interrupt state staying high results in no
> new interrupt and ehci has to run based on polling.
>
> static irqreturn_t ehci_irq (struct usb_hcd *hcd)
> {
> ...
> status = ehci_readl(ehci, &ehci->regs->status);
>
> /* e.g. cardbus physical eject */
> if (status == ~(u32) 0) {
> ehci_dbg (ehci, "device removed\n");
> goto dead;
> }
>
> /*
> * We don't use STS_FLR, but some controllers don't like it to
> * remain on, so mask it out along with the other status bits.
> */
> masked_status = status & (INTR_MASK | STS_FLR);
>
> /* Shared IRQ? */
> if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) {
> spin_unlock_irqrestore(&ehci->lock, flags);
> return IRQ_NONE;
> }
>
> /* clear (just) interrupts */
> ehci_writel(ehci, masked_status, &ehci->regs->status);
> ...
>
> ehci_irq() reads the interrupt status register and then writes the active
> interrupt-related bits back out to ack the interrupt cause.
> But with an edge interrupt, this is racy as another source of interrupt
> could be raised by ehci between the read and the write reaching the
> hardware.
> e.g. If STS_IAA was set during the initial read, but some other bit like
> STS_INT gets raised by the hardware between the read and the write to the
> interrupt status register, the interrupt signal state won't drop.
> The interrupt state says high, and since it is now edged triggered with
> MSI, no new invocation of the interrupt handler gets triggered.
Wouldn't it be better to change these other PCI drivers by adding
proper MSI support? I don't know what would be involved, but
presumably it wouldn't be very hard. (Just run the handler in a loop
until all the interrupt status bits are off?)
Alan Stern
next prev parent reply other threads:[~2021-07-13 19:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-13 18:50 [PATCH] usb: hcd: Revert 306c54d0edb6ba94d39877524dddebaad7770cf2: Try MSI interrupts on PCI devices Laurence Oberman
2021-07-13 19:15 ` Alan Stern [this message]
2021-07-13 20:05 ` Laurence Oberman
2021-07-13 20:30 ` Andy Shevchenko
2021-07-13 20:30 ` kernel test robot
2021-07-13 20:33 ` Andy Shevchenko
2021-07-13 20:44 ` Laurence Oberman
2021-07-13 21:57 ` Laurence Oberman
2021-07-13 23:11 ` kernel test robot
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=20210713191548.GD355405@rowland.harvard.edu \
--to=stern@rowland.harvard.edu \
--cc=andriy.shevchenko@linux.intel.com \
--cc=apanagio@redhat.com \
--cc=djeffery@redhat.com \
--cc=emilne@redhat.com \
--cc=linux-usb@vger.kernel.org \
--cc=loberman@redhat.com \
--cc=stable@vger.kernel.org \
--cc=torez@redhat.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