Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1346973

[tip:smp/hotplug] cpu/hotplug: Convert the hotplugged cpu work to a state machine

From tip-bot for Thomas Gleixner <tipbot@zytor.com>
Newsgroups linux.kernel
Subject [tip:smp/hotplug] cpu/hotplug: Convert the hotplugged cpu work to a state machine
Date 2016-03-01 21:00 +0100
Message-ID <r7YCC-5hG-9@gated-at.bofh.it> (permalink)
References <r6vMm-7w1-27@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Commit-ID:  4baa0afc6719cbf36a1e08551484a641926b3fd1
Gitweb:     http://git.kernel.org/tip/4baa0afc6719cbf36a1e08551484a641926b3fd1
Author:     Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 26 Feb 2016 18:43:29 +0000
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 1 Mar 2016 20:36:54 +0100

cpu/hotplug: Convert the hotplugged cpu work to a state machine

Move the functions which need to run on the hotplugged processor into
a state machine array and let the code iterate through these functions.

In a later state, this will grow synchronization points between the
control processor and the hotplugged processor, so we can move the
various architecture implementations of the synchronizations to the
core.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-arch@vger.kernel.org
Cc: Rik van Riel <riel@redhat.com>
Cc: Rafael Wysocki <rafael.j.wysocki@intel.com>
Cc: "Srivatsa S. Bhat" <srivatsa@mit.edu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul Turner <pjt@google.com>
Link: http://lkml.kernel.org/r/20160226182340.770651526@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 include/linux/cpuhotplug.h |  4 +++
 kernel/cpu.c               | 81 +++++++++++++++++++++++++++++++++++++---------
 2 files changed, 70 insertions(+), 15 deletions(-)

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index d55c9e6..d9303cc 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -6,6 +6,10 @@ enum cpuhp_state {
 	CPUHP_CREATE_THREADS,
 	CPUHP_NOTIFY_PREPARE,
 	CPUHP_BRINGUP_CPU,
+	CPUHP_AP_OFFLINE,
+	CPUHP_AP_NOTIFY_STARTING,
+	CPUHP_AP_ONLINE,
+	CPUHP_TEARDOWN_CPU,
 	CPUHP_NOTIFY_ONLINE,
 	CPUHP_ONLINE,
 };
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 3018519..797723e 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -57,6 +57,7 @@ struct cpuhp_step {
 };
 
 static struct cpuhp_step cpuhp_bp_states[];
+static struct cpuhp_step cpuhp_ap_states[];
 
 /**
  * cpuhp_invoke_callback _ Invoke the callbacks for a given state
@@ -304,6 +305,12 @@ static int notify_online(unsigned int cpu)
 	return 0;
 }
 
+static int notify_starting(unsigned int cpu)
+{
+	cpu_notify(CPU_STARTING, cpu);
+	return 0;
+}
+
 static int bringup_cpu(unsigned int cpu)
 {
 	struct task_struct *idle = idle_thread_get(cpu);
@@ -421,9 +428,17 @@ static int notify_down_prepare(unsigned int cpu)
 	return err;
 }
 
+static int notify_dying(unsigned int cpu)
+{
+	cpu_notify(CPU_DYING, cpu);
+	return 0;
+}
+
 /* Take this CPU down. */
 static int take_cpu_down(void *_param)
 {
+	struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
+	enum cpuhp_state target = max((int)st->target, CPUHP_AP_OFFLINE);
 	int err, cpu = smp_processor_id();
 
 	/* Ensure this CPU doesn't handle any more interrupts. */
@@ -431,7 +446,12 @@ static int take_cpu_down(void *_param)
 	if (err < 0)
 		return err;
 
-	cpu_notify(CPU_DYING, cpu);
+	/* Invoke the former CPU_DYING callbacks */
+	for (; st->state > target; st->state--) {
+		struct cpuhp_step *step = cpuhp_ap_states + st->state;
+
+		cpuhp_invoke_callback(cpu, st->state, step->teardown);
+	}
 	/* Give up timekeeping duties */
 	tick_handover_do_timer();
 	/* Park the stopper thread */
@@ -512,6 +532,7 @@ static int notify_dead(unsigned int cpu)
 #define notify_down_prepare	NULL
 #define takedown_cpu		NULL
 #define notify_dead		NULL
+#define notify_dying		NULL
 #endif
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -615,6 +636,28 @@ void smpboot_thread_init(void)
 	register_cpu_notifier(&smpboot_thread_notifier);
 }
 
+/**
+ * notify_cpu_starting(cpu) - call the CPU_STARTING notifiers
+ * @cpu: cpu that just started
+ *
+ * This function calls the cpu_chain notifiers with CPU_STARTING.
+ * It must be called by the arch code on the new cpu, before the new cpu
+ * enables interrupts and before the "boot" cpu returns from __cpu_up().
+ */
+void notify_cpu_starting(unsigned int cpu)
+{
+	struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
+	enum cpuhp_state target = min((int)st->target, CPUHP_AP_ONLINE);
+
+	while (st->state < target) {
+		struct cpuhp_step *step;
+
+		st->state++;
+		step = cpuhp_ap_states + st->state;
+		cpuhp_invoke_callback(cpu, st->state, step->startup);
+	}
+}
+
 static void undo_cpu_up(unsigned int cpu, struct cpuhp_cpu_state *st)
 {
 	for (st->state--; st->state > st->target; st->state--) {
@@ -842,19 +885,6 @@ core_initcall(cpu_hotplug_pm_sync_init);
 
 #endif /* CONFIG_PM_SLEEP_SMP */
 
-/**
- * notify_cpu_starting(cpu) - call the CPU_STARTING notifiers
- * @cpu: cpu that just started
- *
- * This function calls the cpu_chain notifiers with CPU_STARTING.
- * It must be called by the arch code on the new cpu, before the new cpu
- * enables interrupts and before the "boot" cpu returns from __cpu_up().
- */
-void notify_cpu_starting(unsigned int cpu)
-{
-	cpu_notify(CPU_STARTING, cpu);
-}
-
 #endif /* CONFIG_SMP */
 
 /* Boot processor state steps */
@@ -879,8 +909,12 @@ static struct cpuhp_step cpuhp_bp_states[] = {
 	[CPUHP_BRINGUP_CPU] = {
 		.name			= "cpu:bringup",
 		.startup		= bringup_cpu,
+		.teardown		= NULL,
+	},
+	[CPUHP_TEARDOWN_CPU] = {
+		.name			= "cpu:teardown",
+		.startup		= NULL,
 		.teardown		= takedown_cpu,
-		.skip_onerr		= true,
 	},
 	[CPUHP_NOTIFY_ONLINE] = {
 		.name			= "notify:online",
@@ -895,6 +929,23 @@ static struct cpuhp_step cpuhp_bp_states[] = {
 	},
 };
 
+/* Application processor state steps */
+static struct cpuhp_step cpuhp_ap_states[] = {
+#ifdef CONFIG_SMP
+	[CPUHP_AP_NOTIFY_STARTING] = {
+		.name			= "notify:starting",
+		.startup		= notify_starting,
+		.teardown		= notify_dying,
+		.skip_onerr		= true,
+	},
+#endif
+	[CPUHP_ONLINE] = {
+		.name			= "online",
+		.startup		= NULL,
+		.teardown		= NULL,
+	},
+};
+
 /*
  * cpu_bit_bitmap[] is a special, "compressed" data structure that
  * represents all NR_CPUS bits binary values of 1<<nr.

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[patch 00/20] cpu/hotplug: Core infrastructure for cpu hotplug rework Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
  [patch 14/20] cpu/hotplug: Split out the state walk into functions Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Split out the state walk into  functions tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 17/20] arch/hotplug: Call into idle with a proper state Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] arch/hotplug: Call into idle with a proper state tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 04/20] cpu/hotplug: Split out cpu down functions Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Split out cpu down functions tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Split out cpu down functions "Srivatsa S. Bhat" <srivatsa@csail.mit.edu> - 2016-03-03 00:10 +0100
  [patch 03/20] cpu/hotplug: Restructure cpu_up code Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Restructure cpu_up code tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Restructure cpu_up code "Srivatsa S. Bhat" <srivatsa@csail.mit.edu> - 2016-03-03 00:00 +0100
  [patch 16/20] cpu/hotplug: Move online calls to hotplugged cpu Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Move online calls to hotplugged cpu tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 02/20] cpu/hotplug: Restructure FROZEN state handling Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Restructure FROZEN state handling tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Restructure FROZEN state handling "Srivatsa S. Bhat" <srivatsa@csail.mit.edu> - 2016-03-03 00:10 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Restructure FROZEN state handling "Srivatsa S. Bhat" <srivatsa@csail.mit.edu> - 2016-03-03 00:50 +0100
  [patch 11/20] cpu/hotplug: Implement setup/removal interface Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Implement setup/removal interface tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 12/20] cpu/hotplug: Move scheduler cpu_online notifier to  hotplug core Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Move scheduler cpu_online notifier  to hotplug core tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 18/20] cpu/hotplug: Let upcoming cpu bring itself fully up Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Let upcoming cpu bring itself fully  up tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
    Re: [patch 18/20] cpu/hotplug: Let upcoming cpu bring itself fully up Richard Cochran <richardcochran@gmail.com> - 2016-03-02 18:30 +0100
  [patch 15/20] cpu/hotplug: Create hotplug threads Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Create hotplug threads tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 09/20] cpu/hotplug: Add sysfs state interface Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Add sysfs state interface tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Add sysfs state interface Peter Zijlstra <peterz@infradead.org> - 2016-03-02 13:50 +0100
  [patch 06/20] cpu/hotplug: Convert to a state machine for the control  processor Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Convert to a state machine for the  control processor tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] cpu/hotplug: Convert to a state machine for  the control processor Peter Zijlstra <peterz@infradead.org> - 2016-03-02 12:30 +0100
  [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-02-27 03:20 +0100
      Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-02-27 03:30 +0100
        Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call Thomas Gleixner <tglx@linutronix.de> - 2016-02-27 08:50 +0100
          Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-02-27 12:10 +0100
            Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call Thomas Gleixner <tglx@linutronix.de> - 2016-02-27 12:40 +0100
              Re: [patch 20/20] rcu: Make CPU_DYING_IDLE an explicit call "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-02-27 17:40 +0100
    [tip:smp/hotplug] rcu: Make CPU_DYING_IDLE an explicit call tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
      Re: [tip:smp/hotplug] rcu: Make CPU_DYING_IDLE an explicit call "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-03-02 21:20 +0100
        Re: [tip:smp/hotplug] rcu: Make CPU_DYING_IDLE an explicit call Thomas Gleixner <tglx@linutronix.de> - 2016-03-03 08:40 +0100
        [tip:smp/hotplug] cpu/hotplug: Plug death reporting race tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-03 11:10 +0100
          Re: [tip:smp/hotplug] cpu/hotplug: Plug death reporting race "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-03-03 15:20 +0100
  [patch 08/20] cpu/hotplug: Hand in target state to _cpu_up/down Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Hand in target state to _cpu_up/down tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 19/20] cpu/hotplug: Make wait for dead cpu completion based Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 19:50 +0100
    [tip:smp/hotplug] cpu/hotplug: Make wait for dead cpu completion  based tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 07/20] cpu/hotplug: Convert the hotplugged cpu work to a state  machine Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 20:00 +0100
    [tip:smp/hotplug] cpu/hotplug: Convert the hotplugged cpu work to a  state machine tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2016-03-01 21:00 +0100
  [patch 01/20] idle: Move x86ism out of generic code Thomas Gleixner <tglx@linutronix.de> - 2016-02-26 20:00 +0100
    Re: [patch 01/20] idle: Move x86ism out of generic code Brian Gerst <brgerst@gmail.com> - 2016-02-27 21:30 +0100
      Re: [patch 01/20] idle: Move x86ism out of generic code Thomas Gleixner <tglx@linutronix.de> - 2016-02-29 20:40 +0100
        Re: [patch 01/20] idle: Move x86ism out of generic code Will Deacon <will.deacon@arm.com> - 2016-02-29 20:50 +0100
          Re: [patch 01/20] idle: Move x86ism out of generic code Thomas Gleixner <tglx@linutronix.de> - 2016-02-29 21:10 +0100

csiph-web