workqueue: fix race condition in unbound workqueue free path
authorTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:31 +0000 (11:23 -0700)
committerTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:31 +0000 (11:23 -0700)
commitbc0caf099d9df4dd0fad24992b043b40541f4200
treedddcccaf93af1eacd1606aadb06105e1a8f5ee11
parentb5927605478b740d73192f587e458de1632106e8
workqueue: fix race condition in unbound workqueue free path

8864b4e59 ("workqueue: implement get/put_pwq()") implemented pwq
(pool_workqueue) refcnting which frees workqueue when the last pwq
goes away.  It determined whether it was the last pwq by testing
wq->pwqs is empty.  Unfortunately, the test was done outside wq->mutex
and multiple pwq release could race and try to free wq multiple times
leading to oops.

Test wq->pwqs emptiness while holding wq->mutex.

Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c