Messages in this thread Patch in this message | | | From | Lai Jiangshan <> | Subject | [PATCH 8/9 V3] workqueue: single pass rebind_workers | Date | Thu, 30 Aug 2012 00:51:59 +0800 |
| |
busy_worker_rebind_fn() can't return until all idle workers are rebound, the code of busy_worker_rebind_fn() ensure this.
So we can change the order of the code of rebind_workers(), and make it is a single pass to do the rebind_workers().
It makes the code much clean and better readability.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> --- kernel/workqueue.c | 18 +++--------------- 1 files changed, 3 insertions(+), 15 deletions(-)
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 719d6ec..7e6145b 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1437,16 +1437,11 @@ static void rebind_workers(struct global_cwq *gcwq) init_completion(&idle_rebind.rebind_hold); init_completion(&idle_rebind.ref_done); idle_rebind.ref_cnt = 1; -retry: idle_rebind.idle_cnt = 1; - INIT_COMPLETION(idle_rebind.idle_done); /* set REBIND and kick idle ones, we'll wait for these later */ for_each_worker_pool(pool, gcwq) { list_for_each_entry(worker, &pool->idle_list, entry) { - if (!(worker->flags & WORKER_UNBOUND)) - continue; - /* morph UNBOUND to REBIND */ worker->flags &= ~WORKER_UNBOUND; worker->flags |= WORKER_REBIND; @@ -1460,16 +1455,6 @@ retry: } } - if (--idle_rebind.idle_cnt) { - spin_unlock_irq(&gcwq->lock); - wait_for_completion(&idle_rebind.idle_done); - spin_lock_irq(&gcwq->lock); - /* busy ones might have become idle while waiting, retry */ - goto retry; - } - - complete_all(&idle_rebind.rebind_hold); - /* rebind busy workers */ for_each_busy_worker(worker, i, pos, gcwq) { struct work_struct *rebind_work = &worker->rebind_work; @@ -1497,7 +1482,10 @@ retry: * has ref to this idle_rebind. */ if (--idle_rebind.ref_cnt) { + --idle_rebind.idle_cnt; spin_unlock_irq(&gcwq->lock); + wait_for_completion(&idle_rebind.idle_done); + complete_all(&idle_rebind.rebind_hold); wait_for_completion(&idle_rebind.ref_done); spin_lock_irq(&gcwq->lock); } -- 1.7.4.4
| |