[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160903123133.GD2794@worktop>
Date: Sat, 3 Sep 2016 14:31:33 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: Alan Stern <stern@...land.harvard.edu>
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 Fri, Sep 02, 2016 at 04:29:19PM -0400, Alan Stern wrote:
> I'm afraid so. The code doesn't use wait_event(), in part because
> there's no wait_queue (since only one task is involved).
You can use wait_queue fine with just one task, and it would clean up
the code tremendously.
You can replace things like the earlier mentioned:
while (bh->state != BUF_STATE_EMPTY) {
rc = sleep_thread(common, false);
if (rc)
return rc;
}
with:
rc = wait_event_interruptible(&common->wq, bh->state == BUF_STATE_EMPTY);
if (rc)
return rc;
> But maybe there's another barrier which needs to be fixed. Felipe, can
> you check to see if received_cbw() is getting called in
> get_next_command(), and if so, what value it returns? Or is the
> preceding sleep_thread() the one that never wakes up?
>
> It could be that the smp_wmb() in wakeup_thread() needs to be smp_mb().
> The reason being that get_next_command() runs outside the protection of
> the spinlock.
Being somewhat confused by the code, I fail to follow that argument.
wakeup_thread() is always called under that spinlock(), but since the
critical section is 2 stores, I fail to see how a smp_mb() can make any
difference over the smp_wmb() already there.
Powered by blists - more mailing lists