Re: Alpha Avanti broken by 9ce8654323d69273b4977f76f11c9e2d345ab130

From: Mikulas Patocka (mpatocka@xxxxxxxxxx)
Date: Tue Feb 19 2019 - 08:42:52 EST




On Tue, 21 Aug 2018, Arnd Bergmann wrote:

> On Mon, Aug 20, 2018 at 11:42 PM Mikulas Patocka <mpatocka@xxxxxxxxxx> wrote:
> > On Mon, 20 Aug 2018, Arnd Bergmann wrote:
> >
> > > On Mon, Aug 20, 2018 at 4:17 PM Mikulas Patocka <mpatocka@xxxxxxxxxx> wrote:
> > > > On Sun, 19 Aug 2018, okaya@xxxxxxxxxxxxxx wrote:
> > > >
> > > > > +my new email
> > > > >
> > > > > On 2018-08-18 19:03, Arnd Bergmann wrote:
> > > > > > On Sat, Aug 18, 2018 at 12:05 AM Maciej W. Rozycki <macro@xxxxxxxxxxxxxx>
> > >
> > > > > I think we need to identify the driver that is failing.
> > > >
> > > > It also may be some timing issue.
> > > >
> > > > I observed that not every kernel with the patch
> > > > 92d7223a74235054f2aa7227d207d9c57f84dca0 fails, some of them get stuck
> > > > only at boot, some get stuck only at shutdown, some not at all. Although
> > > > all the kernels with this patch reverted work.
> > > >
> > > > So the patch may have uncovered some timing problem somewhere.
> > > >
> > > > x86 has the function io_delay that injects delays between I/O accesses for
> > > > hardware that needs it - does alpha have something like this?
> > >
> > > The I/O delay would be very low on my list of possible root causes
> > > for this, hardly any hardware at all relies on it, and all uses I see
> > > are related to outb(), which you've already shown not to be the problem
> > > with my test patch.
> > >
> > The lockup happens somewhere in the function autoconfig in
> > drivers/tty/serial/8250/8250_port.c, but I don't know where exactly
> > because serial console doesn't work while the port is being probed.
> >
> > When I use console on a graphics card, the lockup doesn't happen.
>
> Ok, this does strongly suggest that it is the outb() operation that I
> suspected after all, I just sent you a wrong patch to test, failing
> to realize that alpha has two implementations of outb, and that the
> extern one is the one that gets used in a defconfig build.
>
> Could you try again with this patch added in? (Sorry for the whitespace
> damage, you'll have to apply it by hand). Presumably a wmb()
> is sufficient here, but I'm trying to play safe here by restoring the
> barrier that was part of outb() before it broke.
>
> Arnd

Hi

Will you commit this patch?

The avanti platform is still broken in the kernel 5.0 and I tested that
this patch fixes it.

Mikulas


> diff --git a/arch/alpha/kernel/io.c b/arch/alpha/kernel/io.c
> index c025a3e5e357..604237fa821f 100644
> --- a/arch/alpha/kernel/io.c
> +++ b/arch/alpha/kernel/io.c
> @@ -78,16 +78,19 @@ u32 inl(unsigned long port)
> void outb(u8 b, unsigned long port)
> {
> iowrite8(b, ioport_map(port, 1));
> + mb();
> }
>
> void outw(u16 b, unsigned long port)
> {
> iowrite16(b, ioport_map(port, 2));
> + mb();
> }
>
> void outl(u32 b, unsigned long port)
> {
> iowrite32(b, ioport_map(port, 4));
> + mb();
> }
>
> EXPORT_SYMBOL(inb);
> @@ -336,6 +339,7 @@ void iowrite8_rep(void __iomem *port, const void
> *xsrc, unsigned long count)
> void outsb(unsigned long port, const void *src, unsigned long count)
> {
> iowrite8_rep(ioport_map(port, 1), src, count);
> + mb();
> }
>
> EXPORT_SYMBOL(iowrite8_rep);
> @@ -376,6 +380,7 @@ void iowrite16_rep(void __iomem *port, const void
> *src, unsigned long count)
> void outsw(unsigned long port, const void *src, unsigned long count)
> {
> iowrite16_rep(ioport_map(port, 2), src, count);
> + mb();
> }
>
> EXPORT_SYMBOL(iowrite16_rep);
> @@ -408,6 +413,7 @@ void iowrite32_rep(void __iomem *port, const void
> *src, unsigned long count)
> void outsl(unsigned long port, const void *src, unsigned long count)
> {
> iowrite32_rep(ioport_map(port, 4), src, count);
> + mb();
> }
>
> EXPORT_SYMBOL(iowrite32_rep);
>