On Sat, 3 Sep 2016, Alan Stern wrote: > In other words, we have: > > CPU 0 CPU 1 > ----- ----- > Start DMA Handle DMA-complete irq > Sleep until bh->state Set bh->state > smp_wmb() > Wake up CPU 0 > smp_rmb() > Compute rc based on contents > of the DMA buffer > > This was written many years ago, at a time when I did not fully > understand all the details of memory ordering. Do you agree that both > of those barriers should really be smp_mb()? That's what Felipe has > been testing. Actually, seeing it written out like this, one realizes that it really ought to be: CPU 0 CPU 1 ----- ----- Start DMA Handle DMA-complete irq Sleep until bh->state smp_mb() set bh->state Wake up CPU 0 smp_mb() Compute rc based on contents of the DMA buffer (Bear in mind also that on some platforms, the I/O operation is carried out by PIO rather than DMA.) Also, the smp_wmb() in bulk_out_complete() looks unnecessary. I can't remember why I put it there originally. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html