diff options
Diffstat (limited to 'kernel/kthread.c')
| -rw-r--r-- | kernel/kthread.c | 59 | 
1 files changed, 35 insertions, 24 deletions
| diff --git a/kernel/kthread.c b/kernel/kthread.c index 32d620a99f11..2d52126d5da0 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -1030,12 +1030,11 @@ repeat:  EXPORT_SYMBOL_GPL(kthread_worker_fn);  static __printf(3, 0) struct kthread_worker * -__kthread_create_worker(int cpu, unsigned int flags, -			const char namefmt[], va_list args) +__kthread_create_worker_on_node(unsigned int flags, int node, +				const char namefmt[], va_list args)  {  	struct kthread_worker *worker;  	struct task_struct *task; -	int node = NUMA_NO_NODE;  	worker = kzalloc(sizeof(*worker), GFP_KERNEL);  	if (!worker) @@ -1043,20 +1042,14 @@ __kthread_create_worker(int cpu, unsigned int flags,  	kthread_init_worker(worker); -	if (cpu >= 0) -		node = cpu_to_node(cpu); -  	task = __kthread_create_on_node(kthread_worker_fn, worker, -						node, namefmt, args); +					node, namefmt, args);  	if (IS_ERR(task))  		goto fail_task; -	if (cpu >= 0) -		kthread_bind(task, cpu); -  	worker->flags = flags;  	worker->task = task; -	wake_up_process(task); +  	return worker;  fail_task: @@ -1067,6 +1060,7 @@ fail_task:  /**   * kthread_create_worker - create a kthread worker   * @flags: flags modifying the default behavior of the worker + * @node: task structure for the thread is allocated on this node   * @namefmt: printf-style name for the kthread worker (task).   *   * Returns a pointer to the allocated worker on success, ERR_PTR(-ENOMEM) @@ -1074,25 +1068,49 @@ fail_task:   * when the caller was killed by a fatal signal.   */  struct kthread_worker * -kthread_create_worker(unsigned int flags, const char namefmt[], ...) +kthread_create_worker_on_node(unsigned int flags, int node, const char namefmt[], ...) +{ +	struct kthread_worker *worker; +	va_list args; + +	va_start(args, namefmt); +	worker = __kthread_create_worker_on_node(flags, node, namefmt, args); +	va_end(args); + +	if (worker) +		wake_up_process(worker->task); + +	return worker; +} +EXPORT_SYMBOL(kthread_create_worker_on_node); + +static __printf(3, 4) struct kthread_worker * +__kthread_create_worker_on_cpu(int cpu, unsigned int flags, +			       const char namefmt[], ...)  {  	struct kthread_worker *worker;  	va_list args;  	va_start(args, namefmt); -	worker = __kthread_create_worker(-1, flags, namefmt, args); +	worker = __kthread_create_worker_on_node(flags, cpu_to_node(cpu), +						 namefmt, args);  	va_end(args); +	if (worker) { +		kthread_bind(worker->task, cpu); +		wake_up_process(worker->task); +	} +  	return worker;  } -EXPORT_SYMBOL(kthread_create_worker);  /**   * kthread_create_worker_on_cpu - create a kthread worker and bind it   *	to a given CPU and the associated NUMA node.   * @cpu: CPU number   * @flags: flags modifying the default behavior of the worker - * @namefmt: printf-style name for the kthread worker (task). + * @namefmt: printf-style name for the thread. Format is restricted + *	     to "name.*%u". Code fills in cpu number.   *   * Use a valid CPU number if you want to bind the kthread worker   * to the given CPU and the associated NUMA node. @@ -1124,16 +1142,9 @@ EXPORT_SYMBOL(kthread_create_worker);   */  struct kthread_worker *  kthread_create_worker_on_cpu(int cpu, unsigned int flags, -			     const char namefmt[], ...) +			     const char namefmt[])  { -	struct kthread_worker *worker; -	va_list args; - -	va_start(args, namefmt); -	worker = __kthread_create_worker(cpu, flags, namefmt, args); -	va_end(args); - -	return worker; +	return __kthread_create_worker_on_cpu(cpu, flags, namefmt, cpu);  }  EXPORT_SYMBOL(kthread_create_worker_on_cpu); | 
