On Tue, Feb 19, 2019 at 12:36 PM Will Deacon <will.deacon@xxxxxxx> wrote: > On Tue, Feb 19, 2019 at 12:31:50PM +0100, Arnd Bergmann wrote: > > On Tue, Feb 19, 2019 at 11:27 AM Thomas Petazzoni > > <thomas.petazzoni@xxxxxxxxxxx> wrote: > > > > I think an example of this would be a driver using outb() to disable > > an interrupt, and then relying on the the interrupt no longer happening > > after the outb(). > > Isn't that racy already? i.e. the interrupt could fire just before you > disabled it, but not get delivered by the irq controller until after you'd > disabled it at the device? Probably, I had a hard enough time trying to come up with any example ;-) One reference to non-posted transaction in a comment is in drivers/net/ethernet/dec/tulip/de4x5.c: /* ** The DE4X5 interrupt handler. ** ** I/O Read/Writes through intermediate PCI bridges are never 'posted', ** so that the asserted interrupt always has some real data to work with - ** if these I/O accesses are ever changed to memory accesses, ensure the ** STS write is read immediately to complete the transaction if the adapter ** is not on bus 0. Lost interrupts can still occur when the PCI bus load ** is high and descriptor status bits cannot be set before the associated ** interrupt is asserted and this routine entered. */ I found another comment in the via-rhine driver: /* Beware of PCI posted writes */ #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) this one is used in the chip reset function, and in the transmit path. Arnd Arnd