From 4a6739d0ee3a22f13aa564274e651a47d7719074 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Tue, 18 Sep 2012 09:59:22 -0700 Subject: [PATCH] --- yaml --- r: 327187 b: refs/heads/master c: eab6d82843ee1df244f8847d1bf8bb89160ec4aa h: refs/heads/master i: 327185: c2a64689e23af70e6e3188cd1ad8ebea50abf97c 327183: 7a2f3e9dff1513c3fa0f3acd0f4e017a9be55fe5 v: v3 --- [refs] | 2 +- trunk/kernel/workqueue.c | 18 ++---------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 5975117573df..51931b6f422e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ea1abd6197d5805655da1bb589929762f4b4aa08 +refs/heads/master: eab6d82843ee1df244f8847d1bf8bb89160ec4aa diff --git a/trunk/kernel/workqueue.c b/trunk/kernel/workqueue.c index 770c1a8128bf..794724efb733 100644 --- a/trunk/kernel/workqueue.c +++ b/trunk/kernel/workqueue.c @@ -1649,16 +1649,8 @@ static void busy_worker_rebind_fn(struct work_struct *work) struct worker *worker = container_of(work, struct worker, rebind_work); struct global_cwq *gcwq = worker->pool->gcwq; - worker_maybe_bind_and_lock(worker); - - /* - * %WORKER_REBIND must be cleared even if the above binding failed; - * otherwise, we may confuse the next CPU_UP cycle or oops / get - * stuck by calling idle_worker_rebind() prematurely. If CPU went - * down again inbetween, %WORKER_UNBOUND would be set, so clearing - * %WORKER_REBIND is always safe. - */ - worker_clr_flags(worker, WORKER_REBIND); + if (worker_maybe_bind_and_lock(worker)) + worker_clr_flags(worker, WORKER_UNBOUND); spin_unlock_irq(&gcwq->lock); } @@ -1721,15 +1713,9 @@ static void rebind_workers(struct global_cwq *gcwq) /* rebind busy workers */ for_each_busy_worker(worker, i, pos, gcwq) { - unsigned long worker_flags = worker->flags; struct work_struct *rebind_work = &worker->rebind_work; struct workqueue_struct *wq; - /* morph UNBOUND to REBIND atomically */ - worker_flags &= ~WORKER_UNBOUND; - worker_flags |= WORKER_REBIND; - ACCESS_ONCE(worker->flags) = worker_flags; - if (test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(rebind_work))) continue;