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

Reply via email to