lkml.org 
[lkml]   [2012]   [Sep]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/11 V5] workqueue: remove WORKER_REBIND
    Date
    exile operation       = list_del_init(&worker->entry).
    and destory operation -> list_del_init(&worker->entry).

    so we can use list_empty(&worker->entry) to know: does the worker
    has been exiled or killed.

    WORKER_REBIND is not need any more, remove it to reduce the states
    of workers.

    Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
    ---
    kernel/workqueue.c | 21 ++++++++-------------
    1 files changed, 8 insertions(+), 13 deletions(-)

    diff --git a/kernel/workqueue.c b/kernel/workqueue.c
    index ba0ba33..6bf4185 100644
    --- a/kernel/workqueue.c
    +++ b/kernel/workqueue.c
    @@ -72,11 +72,10 @@ enum {
    WORKER_DIE = 1 << 1, /* die die die */
    WORKER_IDLE = 1 << 2, /* is idle */
    WORKER_PREP = 1 << 3, /* preparing to run works */
    - WORKER_REBIND = 1 << 5, /* mom is home, come back */
    WORKER_CPU_INTENSIVE = 1 << 6, /* cpu intensive */
    WORKER_UNBOUND = 1 << 7, /* worker is unbound */

    - WORKER_NOT_RUNNING = WORKER_PREP | WORKER_REBIND | WORKER_UNBOUND |
    + WORKER_NOT_RUNNING = WORKER_PREP | WORKER_UNBOUND |
    WORKER_CPU_INTENSIVE,

    NR_WORKER_POOLS = 2, /* # worker pools per gcwq */
    @@ -1612,7 +1611,7 @@ __acquires(&gcwq->lock)

    /*
    * Rebind an idle @worker to its CPU. worker_thread() will test
    - * %WORKER_REBIND before leaving idle and call this function.
    + * worker->entry before leaving idle and call this function.
    */
    static void idle_worker_rebind(struct worker *worker)
    {
    @@ -1621,7 +1620,6 @@ static void idle_worker_rebind(struct worker *worker)
    if (worker_maybe_bind_and_lock(worker))
    worker_clr_flags(worker, WORKER_UNBOUND);

    - worker_clr_flags(worker, WORKER_REBIND);
    list_add(&worker->entry, &worker->pool->idle_list);
    spin_unlock_irq(&gcwq->lock);
    }
    @@ -1674,11 +1672,9 @@ static void rebind_workers(struct global_cwq *gcwq)
    for_each_worker_pool(pool, gcwq)
    lockdep_assert_held(&pool->manager_mutex);

    - /* set REBIND and kick idle ones */
    + /* exile and kick idle ones */
    for_each_worker_pool(pool, gcwq) {
    list_for_each_entry_safe(worker, n, &pool->idle_list, entry) {
    - worker->flags |= WORKER_REBIND;
    -
    /* exile idle workers */
    list_del_init(&worker->entry);

    @@ -2115,7 +2111,7 @@ __acquires(&gcwq->lock)
    * necessary to avoid spurious warnings from rescuers servicing the
    * unbound or a disassociated gcwq.
    */
    - WARN_ON_ONCE(!(worker->flags & (WORKER_UNBOUND | WORKER_REBIND)) &&
    + WARN_ON_ONCE(!(worker->flags & WORKER_UNBOUND) &&
    !(gcwq->flags & GCWQ_DISASSOCIATED) &&
    raw_smp_processor_id() != gcwq->cpu);

    @@ -2239,18 +2235,17 @@ static int worker_thread(void *__worker)
    woke_up:
    spin_lock_irq(&gcwq->lock);

    - /*
    - * DIE can be set only while idle and REBIND set while busy has
    - * @worker->rebind_work scheduled. Checking here is enough.
    - */
    - if (unlikely(worker->flags & (WORKER_REBIND | WORKER_DIE))) {
    + /* Is it still home ? */
    + if (unlikely(list_empty(&worker->entry))) {
    spin_unlock_irq(&gcwq->lock);

    + /* reason: DIE */
    if (worker->flags & WORKER_DIE) {
    worker->task->flags &= ~PF_WQ_WORKER;
    return 0;
    }

    + /* reason: idle rebind */
    idle_worker_rebind(worker);
    goto woke_up;
    }
    --
    1.7.4.4


    \
     
     \ /
      Last update: 2012-09-05 13:23    [W:4.234 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site