From: Lai Jiangshan <laijs@cn.fujitsu.com>
To: Tejun Heo <tj@kernel.org>
Cc: <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 04/10] workqueue: destroy worker directly in the idle timeout handler
Date: Wed, 7 May 2014 15:10:20 +0800 [thread overview]
Message-ID: <5369DC5C.20001@cn.fujitsu.com> (raw)
In-Reply-To: <20140505143613.GD11231@htj.dyndns.org>
On 05/05/2014 10:36 PM, Tejun Heo wrote:
> On Sun, Apr 27, 2014 at 12:08:59PM +0800, Lai Jiangshan wrote:
>> Since kthread_stop() is removed from destroy_worker(),
>> destroy_worker() doesn't need to sleep.
>> Since "unbind the worker" is moved out from destroy_worker(),
>> destroy_worker() doesn't require manager_mutex.
>>
>> So destroy_worker() can be directly called in the idle timeout
>> handler, it helps us remove POOL_MANAGE_WORKERS and
>> maybe_destroy_worker() and simplify the manage_workers()
>>
>> After POOL_MANAGE_WORKERS is removed, worker_thread() doesn't
>> need to test whether it needs to manage after processed works.
>> So we can remove this test branch.
>
> Ah, so, you can take out workers directly from idle timer. Yeah,
> that's nice. I'm not a big fan of the wait_queue usage in the
> previous patch tho. Can we use a completion instead?
>
> Thanks.
>
1) complete() can't be called inside attach_mutex due to the worker
shouldn't access to the pool after complete().
2) put_unbound_pool() may called from get_unbound_pool(), we need to add
an additional check and avoid the wait_for_completion() if so.
+static void worker_detach_from_pool(struct worker *worker, struct worker_pool *pool)
+{
+ bool is_last;
+
+ mutex_lock(&pool->bind_mutex);
+ list_del(&worker->bind_entry);
+ is_last = list_empty(&worker->bind_entry);
+ mutex_unlock(&pool->bind_mutex);
+
+ /* need some comments here */
+ if (is_last)
+ complete(&pool->workers_detached);
+}
@@ -3588,6 +3587,7 @@ static void put_unbound_pool(struct worker_pool *pool)
mutex_lock(&pool->manager_mutex);
spin_lock_irq(&pool->lock);
+ need_to_wait = pool->nr_workers != 0; /* it may be called from get_unbound_pool() */
while ((worker = first_worker(pool)))
destroy_worker(worker);
WARN_ON(pool->nr_workers || pool->nr_idle);
@@ -3596,6 +3596,8 @@ static void put_unbound_pool(struct worker_pool *pool)
mutex_unlock(&pool->manager_mutex);
mutex_unlock(&pool->manager_arb);
+ if (need_to_wait)
+ wait_for_completion(&pool->workers_detached);
/* shut down the timers */
del_timer_sync(&pool->idle_timer);
del_timer_sync(&pool->mayday_timer);
So I think wait_queue is more grace.
Thanks,
Lai
next prev parent reply other threads:[~2014-05-07 7:06 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-27 4:08 [PATCH 00/10] workqueue: async worker destruction and pool-binding synchronization Lai Jiangshan
2014-04-27 4:08 ` [PATCH 01/10] workqueue: use manager lock only to protect worker_idr Lai Jiangshan
2014-05-05 13:01 ` Tejun Heo
2014-05-06 15:43 ` Lai Jiangshan
2014-04-27 4:08 ` [PATCH 02/10] workqueue: destroy_worker() should destroy idle workers only Lai Jiangshan
2014-05-05 13:13 ` Tejun Heo
2014-05-06 15:58 ` Lai Jiangshan
2014-04-27 4:08 ` [PATCH 03/10] workqueue: async worker destruction Lai Jiangshan
2014-05-05 14:31 ` Tejun Heo
2014-05-05 15:02 ` Tejun Heo
2014-05-06 16:27 ` Lai Jiangshan
2014-05-06 16:31 ` Tejun Heo
2014-05-07 7:30 ` Lai Jiangshan
2014-05-07 13:15 ` Tejun Heo
2014-04-27 4:08 ` [PATCH 04/10] workqueue: destroy worker directly in the idle timeout handler Lai Jiangshan
2014-05-05 14:36 ` Tejun Heo
2014-05-07 7:10 ` Lai Jiangshan [this message]
2014-05-07 13:12 ` Tejun Heo
2014-05-07 13:38 ` Lai Jiangshan
2014-05-07 13:41 ` Tejun Heo
2014-05-07 15:30 ` Lai Jiangshan
2014-05-07 15:37 ` Tejun Heo
2014-04-27 4:09 ` [PATCH 05/10] workqueue: separate iteration role from worker_idr Lai Jiangshan
2014-05-05 14:57 ` Tejun Heo
2014-04-27 4:09 ` [PATCH 06/10] workqueue: convert worker_idr to worker_ida Lai Jiangshan
2014-05-05 14:59 ` Tejun Heo
2014-05-06 16:33 ` Lai Jiangshan
2014-05-06 16:35 ` Tejun Heo
2014-05-06 16:38 ` Tejun Heo
2014-04-27 4:09 ` [PATCH 07/10] workqueue: narrow the protection range of manager_mutex Lai Jiangshan
2014-04-27 4:09 ` [PATCH 08/10] workqueue: rename manager_mutex to bind_mutex Lai Jiangshan
2014-04-27 4:09 ` [PATCH 09/10] workqueue: separate pool-binding code out from create_worker() Lai Jiangshan
2014-04-27 4:09 ` [PATCH 10/10] workqueue: use generic pool-bind/unbind routine for rescuers Lai Jiangshan
2014-05-05 14:54 ` Tejun Heo
2014-05-05 15:05 ` [PATCH 00/10] workqueue: async worker destruction and pool-binding synchronization Tejun Heo
2014-05-12 6:56 ` [PATCH 00/10 V2] workqueue: async worker destruction and worker attaching/detaching Lai Jiangshan
2014-05-12 6:56 ` [PATCH 01/10 V2] workqueue: use manager lock only to protect worker_idr Lai Jiangshan
2014-05-12 6:56 ` [PATCH 02/10 V2] workqueue: destroy_worker() should destroy idle workers only Lai Jiangshan
2014-05-12 21:08 ` Tejun Heo
2014-05-13 6:08 ` Lai Jiangshan
2014-05-12 6:56 ` [PATCH 03/10 V2] workqueue: async worker destruction Lai Jiangshan
2014-05-12 21:20 ` Tejun Heo
2014-05-13 6:32 ` Lai Jiangshan
2014-05-13 14:14 ` Tejun Heo
2014-05-20 9:54 ` Lai Jiangshan
2014-05-12 6:56 ` [PATCH 04/10 V2] workqueue: destroy worker directly in the idle timeout handler Lai Jiangshan
2014-05-12 21:26 ` Tejun Heo
2014-05-12 6:56 ` [PATCH 05/10 V2] workqueue: separate iteration role from worker_idr Lai Jiangshan
2014-05-12 21:35 ` Tejun Heo
2014-05-12 21:37 ` Tejun Heo
2014-05-12 6:56 ` [PATCH 06/10 V2] workqueue: convert worker_idr to worker_ida Lai Jiangshan
2014-05-12 21:40 ` Tejun Heo
2014-05-13 6:43 ` Lai Jiangshan
2014-05-13 14:17 ` Tejun Heo
2014-05-12 6:56 ` [PATCH 07/10 V2] workqueue: narrow the protection range of manager_mutex Lai Jiangshan
2014-05-12 6:56 ` [PATCH 08/10 V2] workqueue: rename manager_mutex to attach_mutex Lai Jiangshan
2014-05-12 22:01 ` Tejun Heo
2014-05-13 6:45 ` Lai Jiangshan
2014-05-13 14:19 ` Tejun Heo
2014-05-12 6:56 ` [PATCH 09/10 V2] workqueue: separate pool-attaching code out from create_worker() Lai Jiangshan
2014-05-12 6:56 ` [PATCH 10/10 V2] workqueue: use generic attach/detach routine for rescuers Lai Jiangshan
2014-05-12 22:05 ` Tejun Heo
2014-05-13 6:55 ` Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 00/10] workqueue: async worker destruction and worker attaching/detaching Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 01/10] workqueue: use manager lock only to protect worker_idr Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 02/10] workqueue: destroy_worker() should destroy idle workers only Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 03/10] workqueue: async worker destruction Lai Jiangshan
2014-05-20 14:22 ` Tejun Heo
2014-05-20 14:23 ` Tejun Heo
2014-05-20 14:24 ` Tejun Heo
2014-05-20 9:46 ` [PATCH V3 04/10] workqueue: destroy worker directly in the idle timeout handler Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 05/10] workqueue: separate iteration role from worker_idr Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 06/10] workqueue: convert worker_idr to worker_ida Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 07/10] workqueue: narrow the protection range of manager_mutex Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 08/10] workqueue: rename manager_mutex to attach_mutex Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 09/10] workqueue: separate pool-attaching code out from create_worker() Lai Jiangshan
2014-05-20 9:46 ` [PATCH V3 10/10] workqueue: use generic attach/detach routine for rescuers Lai Jiangshan
2014-05-20 15:00 ` [PATCH V3 00/10] workqueue: async worker destruction and worker attaching/detaching Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5369DC5C.20001@cn.fujitsu.com \
--to=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.