Without this memory barrier, the file-storage thread may fail to
escape from the following while loop, because it may observe new
common->thread_wakeup_needed and old bh->state which are updated by
the callback functions.
/* Wait for the CBW to arrive */
while (bh->state != BUF_STATE_FULL) {
rc = sleep_thread(common);
if (rc)
return rc;
}
Cc: [email protected]
Signed-off-by: UCHINO Satoshi <[email protected]>
---
drivers/usb/gadget/f_mass_storage.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/f_mass_storage.c
b/drivers/usb/gadget/f_mass_storage.c
index fc5c16c..0b6d351 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -414,6 +414,7 @@ static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep
*ep)
static void wakeup_thread(struct fsg_common *common)
{
/* Tell the main thread that something has happened */
+ smp_wmb();
common->thread_wakeup_needed = 1;
if (common->thread_task)
wake_up_process(common->thread_task);
@@ -632,6 +633,7 @@ static int sleep_thread(struct fsg_common *common)
}
__set_current_state(TASK_RUNNING);
common->thread_wakeup_needed = 0;
+ smp_rmb();
return rc;
}
--
1.7.4.1
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html