Commit 98458172 authored by Thomas Gleixner's avatar Thomas Gleixner

cpu/hotplug: Split out cpu down functions

Split cpu_down in separate functions in preparation for state machine
conversion.
Signed-off-by: default avatarThomas 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.511796562@linutronix.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent ba997462
...@@ -266,11 +266,6 @@ static int bringup_cpu(unsigned int cpu) ...@@ -266,11 +266,6 @@ static int bringup_cpu(unsigned int cpu)
} }
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static void cpu_notify_nofail(unsigned long val, unsigned int cpu)
{
BUG_ON(cpu_notify(val, cpu));
}
EXPORT_SYMBOL(register_cpu_notifier); EXPORT_SYMBOL(register_cpu_notifier);
EXPORT_SYMBOL(__register_cpu_notifier); EXPORT_SYMBOL(__register_cpu_notifier);
...@@ -353,6 +348,25 @@ static inline void check_for_tasks(int dead_cpu) ...@@ -353,6 +348,25 @@ static inline void check_for_tasks(int dead_cpu)
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
} }
static void cpu_notify_nofail(unsigned long val, unsigned int cpu)
{
BUG_ON(cpu_notify(val, cpu));
}
static int notify_down_prepare(unsigned int cpu)
{
int err, nr_calls = 0;
err = __cpu_notify(CPU_DOWN_PREPARE, cpu, -1, &nr_calls);
if (err) {
nr_calls--;
__cpu_notify(CPU_DOWN_FAILED, cpu, nr_calls, NULL);
pr_warn("%s: attempt to take down CPU %u failed\n",
__func__, cpu);
}
return err;
}
/* Take this CPU down. */ /* Take this CPU down. */
static int take_cpu_down(void *_param) static int take_cpu_down(void *_param)
{ {
...@@ -371,29 +385,9 @@ static int take_cpu_down(void *_param) ...@@ -371,29 +385,9 @@ static int take_cpu_down(void *_param)
return 0; return 0;
} }
/* Requires cpu_add_remove_lock to be held */ static int takedown_cpu(unsigned int cpu)
static int _cpu_down(unsigned int cpu, int tasks_frozen)
{ {
int err, nr_calls = 0; int err;
if (num_online_cpus() == 1)
return -EBUSY;
if (!cpu_online(cpu))
return -EINVAL;
cpu_hotplug_begin();
cpuhp_tasks_frozen = tasks_frozen;
err = __cpu_notify(CPU_DOWN_PREPARE, cpu, -1, &nr_calls);
if (err) {
nr_calls--;
__cpu_notify(CPU_DOWN_FAILED, cpu, nr_calls, NULL);
pr_warn("%s: attempt to take down CPU %u failed\n",
__func__, cpu);
goto out_release;
}
/* /*
* By now we've cleared cpu_active_mask, wait for all preempt-disabled * By now we've cleared cpu_active_mask, wait for all preempt-disabled
...@@ -426,7 +420,7 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen) ...@@ -426,7 +420,7 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
/* CPU didn't die: tell everyone. Can't complain. */ /* CPU didn't die: tell everyone. Can't complain. */
cpu_notify_nofail(CPU_DOWN_FAILED, cpu); cpu_notify_nofail(CPU_DOWN_FAILED, cpu);
irq_unlock_sparse(); irq_unlock_sparse();
goto out_release; return err;
} }
BUG_ON(cpu_online(cpu)); BUG_ON(cpu_online(cpu));
...@@ -449,11 +443,40 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen) ...@@ -449,11 +443,40 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
/* This actually kills the CPU. */ /* This actually kills the CPU. */
__cpu_die(cpu); __cpu_die(cpu);
/* CPU is completely dead: tell everyone. Too late to complain. */
tick_cleanup_dead_cpu(cpu); tick_cleanup_dead_cpu(cpu);
cpu_notify_nofail(CPU_DEAD, cpu); return 0;
}
static int notify_dead(unsigned int cpu)
{
cpu_notify_nofail(CPU_DEAD, cpu);
check_for_tasks(cpu); check_for_tasks(cpu);
return 0;
}
/* Requires cpu_add_remove_lock to be held */
static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
{
int err;
if (num_online_cpus() == 1)
return -EBUSY;
if (!cpu_online(cpu))
return -EINVAL;
cpu_hotplug_begin();
cpuhp_tasks_frozen = tasks_frozen;
err = notify_down_prepare(cpu);
if (err)
goto out_release;
err = takedown_cpu(cpu);
if (err)
goto out_release;
notify_dead(cpu);
out_release: out_release:
cpu_hotplug_done(); cpu_hotplug_done();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment