diff options
author | Thomas Tuttle <ttuttle@chromium.org> | 2011-09-14 16:22:28 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-10-03 11:40:31 -0700 |
commit | d5b1a08d0d0a73c716766275eb0c5648e143ca85 (patch) | |
tree | 2f62c1aa34c268658ca29b6776fdb73b71fcc7e9 /block | |
parent | c780713f786ee22532839502ed35f1bd1cb0fd1d (diff) |
workqueue: lock cwq access in drain_workqueue
commit fa2563e41c3d6d6e8af437643981ed28ae0cb56d upstream.
Take cwq->gcwq->lock to avoid racing between drain_workqueue checking to
make sure the workqueues are empty and cwq_dec_nr_in_flight decrementing
and then incrementing nr_active when it activates a delayed work.
We discovered this when a corner case in one of our drivers resulted in
us trying to destroy a workqueue in which the remaining work would
always requeue itself again in the same workqueue. We would hit this
race condition and trip the BUG_ON on workqueue.c:3080.
Signed-off-by: Thomas Tuttle <ttuttle@chromium.org>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'block')
0 files changed, 0 insertions, 0 deletions