mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 14:11:20 +00:00
workqueue: separate pool-attaching code out from create_worker()
Currently, the code to attach a new worker to its pool is embedded in create_worker(). Separating this code out will make the codes clearer and will allow rescuers to share the code path later. tj: Description and comment updates. Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
92f9c5c40c
commit
4736cbf7a4
1 changed files with 38 additions and 23 deletions
|
@ -66,7 +66,7 @@ enum {
|
||||||
*
|
*
|
||||||
* Note that DISASSOCIATED should be flipped only while holding
|
* Note that DISASSOCIATED should be flipped only while holding
|
||||||
* attach_mutex to avoid changing binding state while
|
* attach_mutex to avoid changing binding state while
|
||||||
* create_worker() is in progress.
|
* worker_attach_to_pool() is in progress.
|
||||||
*/
|
*/
|
||||||
POOL_DISASSOCIATED = 1 << 2, /* cpu can't serve workers */
|
POOL_DISASSOCIATED = 1 << 2, /* cpu can't serve workers */
|
||||||
POOL_FREEZING = 1 << 3, /* freeze in progress */
|
POOL_FREEZING = 1 << 3, /* freeze in progress */
|
||||||
|
@ -1682,14 +1682,47 @@ static struct worker *alloc_worker(void)
|
||||||
return worker;
|
return worker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* worker_attach_to_pool() - attach a worker to a pool
|
||||||
|
* @worker: worker to be attached
|
||||||
|
* @pool: the target pool
|
||||||
|
*
|
||||||
|
* Attach @worker to @pool. Once attached, the %WORKER_UNBOUND flag and
|
||||||
|
* cpu-binding of @worker are kept coordinated with the pool across
|
||||||
|
* cpu-[un]hotplugs.
|
||||||
|
*/
|
||||||
|
static void worker_attach_to_pool(struct worker *worker,
|
||||||
|
struct worker_pool *pool)
|
||||||
|
{
|
||||||
|
mutex_lock(&pool->attach_mutex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set_cpus_allowed_ptr() will fail if the cpumask doesn't have any
|
||||||
|
* online CPUs. It'll be re-applied when any of the CPUs come up.
|
||||||
|
*/
|
||||||
|
set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The pool->attach_mutex ensures %POOL_DISASSOCIATED remains
|
||||||
|
* stable across this function. See the comments above the
|
||||||
|
* flag definition for details.
|
||||||
|
*/
|
||||||
|
if (pool->flags & POOL_DISASSOCIATED)
|
||||||
|
worker->flags |= WORKER_UNBOUND;
|
||||||
|
|
||||||
|
list_add_tail(&worker->node, &pool->workers);
|
||||||
|
|
||||||
|
mutex_unlock(&pool->attach_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* worker_detach_from_pool() - detach a worker from its pool
|
* worker_detach_from_pool() - detach a worker from its pool
|
||||||
* @worker: worker which is attached to its pool
|
* @worker: worker which is attached to its pool
|
||||||
* @pool: the pool @worker is attached to
|
* @pool: the pool @worker is attached to
|
||||||
*
|
*
|
||||||
* Undo the attaching which had been done in create_worker(). The caller
|
* Undo the attaching which had been done in worker_attach_to_pool(). The
|
||||||
* worker shouldn't access to the pool after detached except it has other
|
* caller worker shouldn't access to the pool after detached except it has
|
||||||
* reference to the pool.
|
* other reference to the pool.
|
||||||
*/
|
*/
|
||||||
static void worker_detach_from_pool(struct worker *worker,
|
static void worker_detach_from_pool(struct worker *worker,
|
||||||
struct worker_pool *pool)
|
struct worker_pool *pool)
|
||||||
|
@ -1753,26 +1786,8 @@ static struct worker *create_worker(struct worker_pool *pool)
|
||||||
/* prevent userland from meddling with cpumask of workqueue workers */
|
/* prevent userland from meddling with cpumask of workqueue workers */
|
||||||
worker->task->flags |= PF_NO_SETAFFINITY;
|
worker->task->flags |= PF_NO_SETAFFINITY;
|
||||||
|
|
||||||
mutex_lock(&pool->attach_mutex);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set_cpus_allowed_ptr() will fail if the cpumask doesn't have any
|
|
||||||
* online CPUs. It'll be re-applied when any of the CPUs come up.
|
|
||||||
*/
|
|
||||||
set_cpus_allowed_ptr(worker->task, pool->attrs->cpumask);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The pool->attach_mutex ensures %POOL_DISASSOCIATED
|
|
||||||
* remains stable across this function. See the comments above the
|
|
||||||
* flag definition for details.
|
|
||||||
*/
|
|
||||||
if (pool->flags & POOL_DISASSOCIATED)
|
|
||||||
worker->flags |= WORKER_UNBOUND;
|
|
||||||
|
|
||||||
/* successful, attach the worker to the pool */
|
/* successful, attach the worker to the pool */
|
||||||
list_add_tail(&worker->node, &pool->workers);
|
worker_attach_to_pool(worker, pool);
|
||||||
|
|
||||||
mutex_unlock(&pool->attach_mutex);
|
|
||||||
|
|
||||||
return worker;
|
return worker;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue