[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Pine.LNX.4.44L0.1609031040580.768-100000@netrider.rowland.org>
Date: Sat, 3 Sep 2016 10:49:39 -0400 (EDT)
From: Alan Stern <stern@...land.harvard.edu>
To: Peter Zijlstra <peterz@...radead.org>
cc: "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>,
Ingo Molnar <mingo@...hat.com>,
Felipe Balbi <felipe.balbi@...ux.intel.com>,
USB list <linux-usb@...r.kernel.org>,
Kernel development list <linux-kernel@...r.kernel.org>
Subject: Re: Memory barrier needed with wake_up_process()?
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
Powered by blists - more mailing lists