summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2016-10-11 16:55:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-11 18:06:33 -0400
commita65d40961dc70d15dec046c2ee88c556f57940b2 (patch)
treeaa74e161fc36b33859a7752277979d05b0887979
parent3989144f863ac576e6efba298d24b0b02a10d4bb (diff)
kthread/smpboot: do not park in kthread_create_on_cpu()
kthread_create_on_cpu() was added by the commit 2a1d446019f9a5983e ("kthread: Implement park/unpark facility"). It is currently used only when enabling new CPU. For this purpose, the newly created kthread has to be parked. The CPU binding is a bit tricky. The kthread is parked when the CPU has not been allowed yet. And the CPU is bound when the kthread is unparked. The function would be useful for more per-CPU kthreads, e.g. bnx2fc_thread, fcoethread. For this purpose, the newly created kthread should stay in the uninterruptible state. This patch moves the parking into smpboot. It binds the thread already when created. Then the function might be used universally. Also the behavior is consistent with kthread_create() and kthread_create_on_node(). Link: http://lkml.kernel.org/r/1470754545-17632-4-git-send-email-pmladek@suse.com Signed-off-by: Petr Mladek <pmladek@suse.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Tejun Heo <tj@kernel.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Borislav Petkov <bp@suse.de> Cc: Michal Hocko <mhocko@suse.cz> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--kernel/kthread.c8
-rw-r--r--kernel/smpboot.c5
2 files changed, 11 insertions, 2 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c
index c52a05a8ec52..f5dc0b151d61 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -390,10 +390,10 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
390 cpu); 390 cpu);
391 if (IS_ERR(p)) 391 if (IS_ERR(p))
392 return p; 392 return p;
393 kthread_bind(p, cpu);
394 /* CPU hotplug need to bind once again when unparking the thread. */
393 set_bit(KTHREAD_IS_PER_CPU, &to_kthread(p)->flags); 395 set_bit(KTHREAD_IS_PER_CPU, &to_kthread(p)->flags);
394 to_kthread(p)->cpu = cpu; 396 to_kthread(p)->cpu = cpu;
395 /* Park the thread to get it out of TASK_UNINTERRUPTIBLE state */
396 kthread_park(p);
397 return p; 397 return p;
398} 398}
399 399
@@ -407,6 +407,10 @@ static void __kthread_unpark(struct task_struct *k, struct kthread *kthread)
407 * which might be about to be cleared. 407 * which might be about to be cleared.
408 */ 408 */
409 if (test_and_clear_bit(KTHREAD_IS_PARKED, &kthread->flags)) { 409 if (test_and_clear_bit(KTHREAD_IS_PARKED, &kthread->flags)) {
410 /*
411 * Newly created kthread was parked when the CPU was offline.
412 * The binding was lost and we need to set it again.
413 */
410 if (test_bit(KTHREAD_IS_PER_CPU, &kthread->flags)) 414 if (test_bit(KTHREAD_IS_PER_CPU, &kthread->flags))
411 __kthread_bind(k, kthread->cpu, TASK_PARKED); 415 __kthread_bind(k, kthread->cpu, TASK_PARKED);
412 wake_up_state(k, TASK_PARKED); 416 wake_up_state(k, TASK_PARKED);
diff --git a/kernel/smpboot.c b/kernel/smpboot.c
index 13bc43d1fb22..4a5c6e73ecd4 100644
--- a/kernel/smpboot.c
+++ b/kernel/smpboot.c
@@ -186,6 +186,11 @@ __smpboot_create_thread(struct smp_hotplug_thread *ht, unsigned int cpu)
186 kfree(td); 186 kfree(td);
187 return PTR_ERR(tsk); 187 return PTR_ERR(tsk);
188 } 188 }
189 /*
190 * Park the thread so that it could start right on the CPU
191 * when it is available.
192 */
193 kthread_park(tsk);
189 get_task_struct(tsk); 194 get_task_struct(tsk);
190 *per_cpu_ptr(ht->store, cpu) = tsk; 195 *per_cpu_ptr(ht->store, cpu) = tsk;
191 if (ht->create) { 196 if (ht->create) {