Re: [PATCH] alpha: add udelay to io port paths

From: Mikulas Patocka (mpatocka@xxxxxxxxxx)
Date: Sun Apr 07 2019 - 13:39:04 EST




On Fri, 5 Apr 2019, Maciej W. Rozycki wrote:

> On Fri, 5 Apr 2019, Mikulas Patocka wrote:
>
> > > > I did some more testing and it turns out that mb() is not entirely
> > > > sufficient to prevent the boot hang. mb()'s latecy varies, sometimes it is
> > > > sufficient, sometimes not.
> > > >
> > > > So, I submit this patch that adds 1us delay between any I/O accesses
> > > > directed at the ISA bus. This patch makes my machine boot. 1us seems to be
> > > > minimal acceptable value, with 800ns I still get hangs.
> > >
> > > Why wasn't the delay needed then before commit cd0e00c10672 ("alpha: io:
> > > reorder barriers to guarantee writeX() and iowriteX() ordering"), which
> > > only moved `mb' around?
> > >
> > > Maciej
> >
> > Suppose that someone does
> > outl(123, INDEX); x = inl(DATA);
> >
> > Before the patch cd0e00c10672, the kernel would do
> > __iowrite(123, INDEX);
> > mb();
> > x = __ioread(DATA);
> > mb();
> >
> > After the patch cd0e00c10672, the kernel would do
> > mb();
> > __iowrite(123, INDEX);
> > x = __ioread(DATA);
> > mb();
> >
> > The patch changes the timing between the write and the read and the
> > hardware doesn't like it.
>
> Obviously you do need that `mb' before `__ioread' in the second case,
> just like in the first one, because otherwise the read bus access issued
> by `__ioread' can be reordered ahead of the write bus access issued by the
> preceding `__iowrite'.

So, take my patch that adds the "mb()" there:
https://www.spinics.net/lists/linux-alpha/msg05007.html

This bug can be fixed by adding "mb()", by adding udelay() or by adding a
dummy read of port 0x80.

So, choose one of these ways to fix it and commit it to the kernel.

Mikulas