aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds2013-03-05 20:07:12 -0600
committerLinus Torvalds2013-03-05 20:07:12 -0600
commit6516ab6fdffbda656253d4e1231660c3f87f7889 (patch)
tree516f37c91a7240604153df590eb771bb65384932
parent06e79d3b45df263984539c417d9c781bdaa31351 (diff)
parent46c498c2cdee5efe44f617bcd4f388179be36115 (diff)
downloadam43-linux-kernel-6516ab6fdffbda656253d4e1231660c3f87f7889.tar.gz
am43-linux-kernel-6516ab6fdffbda656253d4e1231660c3f87f7889.tar.xz
am43-linux-kernel-6516ab6fdffbda656253d4e1231660c3f87f7889.zip
Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull smpboot bugfix from Thomas Gleixner: "A single bugfix for a regression introduced with the conversion of the stop machine threads to the generic smpboot thread management facility" * 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: stop_machine: Mark per cpu stopper enabled early
-rw-r--r--include/linux/smpboot.h4
-rw-r--r--kernel/smpboot.c2
-rw-r--r--kernel/stop_machine.c2
3 files changed, 7 insertions, 1 deletions
diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h
index c65dee05991..13e92967955 100644
--- a/include/linux/smpboot.h
+++ b/include/linux/smpboot.h
@@ -24,6 +24,9 @@ struct smpboot_thread_data;
24 * parked (cpu offline) 24 * parked (cpu offline)
25 * @unpark: Optional unpark function, called when the thread is 25 * @unpark: Optional unpark function, called when the thread is
26 * unparked (cpu online) 26 * unparked (cpu online)
27 * @pre_unpark: Optional unpark function, called before the thread is
28 * unparked (cpu online). This is not guaranteed to be
29 * called on the target cpu of the thread. Careful!
27 * @selfparking: Thread is not parked by the park function. 30 * @selfparking: Thread is not parked by the park function.
28 * @thread_comm: The base name of the thread 31 * @thread_comm: The base name of the thread
29 */ 32 */
@@ -37,6 +40,7 @@ struct smp_hotplug_thread {
37 void (*cleanup)(unsigned int cpu, bool online); 40 void (*cleanup)(unsigned int cpu, bool online);
38 void (*park)(unsigned int cpu); 41 void (*park)(unsigned int cpu);
39 void (*unpark)(unsigned int cpu); 42 void (*unpark)(unsigned int cpu);
43 void (*pre_unpark)(unsigned int cpu);
40 bool selfparking; 44 bool selfparking;
41 const char *thread_comm; 45 const char *thread_comm;
42}; 46};
diff --git a/kernel/smpboot.c b/kernel/smpboot.c
index b9bde572782..25d3d8b6e4e 100644
--- a/kernel/smpboot.c
+++ b/kernel/smpboot.c
@@ -209,6 +209,8 @@ static void smpboot_unpark_thread(struct smp_hotplug_thread *ht, unsigned int cp
209{ 209{
210 struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu); 210 struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu);
211 211
212 if (ht->pre_unpark)
213 ht->pre_unpark(cpu);
212 kthread_unpark(tsk); 214 kthread_unpark(tsk);
213} 215}
214 216
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index 95d178c62d5..c09f2955ae3 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -336,7 +336,7 @@ static struct smp_hotplug_thread cpu_stop_threads = {
336 .create = cpu_stop_create, 336 .create = cpu_stop_create,
337 .setup = cpu_stop_unpark, 337 .setup = cpu_stop_unpark,
338 .park = cpu_stop_park, 338 .park = cpu_stop_park,
339 .unpark = cpu_stop_unpark, 339 .pre_unpark = cpu_stop_unpark,
340 .selfparking = true, 340 .selfparking = true,
341}; 341};
342 342