diff options
| author | Tejun Heo <tj@kernel.org> | 2018-01-08 05:38:32 -0800 | 
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2018-01-08 05:38:32 -0800 | 
| commit | 983c751532738b83c4c5b51192ebc6fbfe9330f7 (patch) | |
| tree | f4f41a78dce360f75ae245bb5298aa8864b2dfd8 | |
| parent | b2cd1df66037e7c4697c7e40496bf7e4a5e16a2d (diff) | |
workqueue: separate out init_rescuer()
Separate out init_rescuer() from __alloc_workqueue_key() to prepare
for early init support for WQ_MEM_RECLAIM.  This patch doesn't
introduce any functional changes.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
| -rw-r--r-- | kernel/workqueue.c | 56 | 
1 files changed, 33 insertions, 23 deletions
| diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 43d18cb46308..5baac7c8a5f9 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -3939,6 +3939,37 @@ static int wq_clamp_max_active(int max_active, unsigned int flags,  	return clamp_val(max_active, 1, lim);  } +/* + * Workqueues which may be used during memory reclaim should have a rescuer + * to guarantee forward progress. + */ +static int init_rescuer(struct workqueue_struct *wq) +{ +	struct worker *rescuer; +	int ret; + +	if (!(wq->flags & WQ_MEM_RECLAIM)) +		return 0; + +	rescuer = alloc_worker(NUMA_NO_NODE); +	if (!rescuer) +		return -ENOMEM; + +	rescuer->rescue_wq = wq; +	rescuer->task = kthread_create(rescuer_thread, rescuer, "%s", wq->name); +	ret = PTR_ERR_OR_ZERO(rescuer->task); +	if (ret) { +		kfree(rescuer); +		return ret; +	} + +	wq->rescuer = rescuer; +	kthread_bind_mask(rescuer->task, cpu_possible_mask); +	wake_up_process(rescuer->task); + +	return 0; +} +  struct workqueue_struct *__alloc_workqueue_key(const char *fmt,  					       unsigned int flags,  					       int max_active, @@ -4001,29 +4032,8 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt,  	if (alloc_and_link_pwqs(wq) < 0)  		goto err_free_wq; -	/* -	 * Workqueues which may be used during memory reclaim should -	 * have a rescuer to guarantee forward progress. -	 */ -	if (flags & WQ_MEM_RECLAIM) { -		struct worker *rescuer; - -		rescuer = alloc_worker(NUMA_NO_NODE); -		if (!rescuer) -			goto err_destroy; - -		rescuer->rescue_wq = wq; -		rescuer->task = kthread_create(rescuer_thread, rescuer, "%s", -					       wq->name); -		if (IS_ERR(rescuer->task)) { -			kfree(rescuer); -			goto err_destroy; -		} - -		wq->rescuer = rescuer; -		kthread_bind_mask(rescuer->task, cpu_possible_mask); -		wake_up_process(rescuer->task); -	} +	if (init_rescuer(wq) < 0) +		goto err_destroy;  	if ((wq->flags & WQ_SYSFS) && workqueue_sysfs_register(wq))  		goto err_destroy; | 
