Skip to content

Commit

Permalink
cpu/hotplug: Split out cpu down functions
Browse files Browse the repository at this point in the history
Split cpu_down in separate functions in preparation for state machine
conversion.

Signed-off-by: Thomas Gleixner <[email protected]>
Cc: [email protected]
Cc: Rik van Riel <[email protected]>
Cc: Rafael Wysocki <[email protected]>
Cc: "Srivatsa S. Bhat" <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Arjan van de Ven <[email protected]>
Cc: Sebastian Siewior <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Paul McKenney <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Paul Turner <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Thomas Gleixner <[email protected]>
  • Loading branch information
KAGA-KOKO committed Mar 1, 2016
1 parent ba99746 commit 9845817
Showing 1 changed file with 53 additions and 30 deletions.
83 changes: 53 additions & 30 deletions kernel/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,6 @@ static int bringup_cpu(unsigned int 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);

Expand Down Expand Up @@ -353,6 +348,25 @@ static inline void check_for_tasks(int dead_cpu)
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. */
static int take_cpu_down(void *_param)
{
Expand All @@ -371,29 +385,9 @@ static int take_cpu_down(void *_param)
return 0;
}

/* Requires cpu_add_remove_lock to be held */
static int _cpu_down(unsigned int cpu, int tasks_frozen)
static int takedown_cpu(unsigned int cpu)
{
int err, nr_calls = 0;

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;
}
int err;

/*
* By now we've cleared cpu_active_mask, wait for all preempt-disabled
Expand Down Expand Up @@ -426,7 +420,7 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
/* CPU didn't die: tell everyone. Can't complain. */
cpu_notify_nofail(CPU_DOWN_FAILED, cpu);
irq_unlock_sparse();
goto out_release;
return err;
}
BUG_ON(cpu_online(cpu));

Expand All @@ -449,11 +443,40 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
/* This actually kills the CPU. */
__cpu_die(cpu);

/* CPU is completely dead: tell everyone. Too late to complain. */
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);
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:
cpu_hotplug_done();
Expand Down

0 comments on commit 9845817

Please sign in to comment.