Skip to content

Commit

Permalink
clocksource/dummy_timer: Convert to hotplug state machine
Browse files Browse the repository at this point in the history
Install the callbacks via the state machine and let the core invoke
the callbacks on the already online CPUs.

Signed-off-by: Richard Cochran <rcochran@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/20160713153336.130385842@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Richard Cochran authored and Ingo Molnar committed Jul 15, 2016
1 parent 7e86e8b commit 00c1d17
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 30 deletions.
36 changes: 6 additions & 30 deletions drivers/clocksource/dummy_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@

static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt);

static void dummy_timer_setup(void)
static int dummy_timer_starting_cpu(unsigned int cpu)
{
int cpu = smp_processor_id();
struct clock_event_device *evt = raw_cpu_ptr(&dummy_timer_evt);
struct clock_event_device *evt = per_cpu_ptr(&dummy_timer_evt, cpu);

evt->name = "dummy_timer";
evt->features = CLOCK_EVT_FEAT_PERIODIC |
Expand All @@ -29,36 +28,13 @@ static void dummy_timer_setup(void)
evt->cpumask = cpumask_of(cpu);

clockevents_register_device(evt);
return 0;
}

static int dummy_timer_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
dummy_timer_setup();

return NOTIFY_OK;
}

static struct notifier_block dummy_timer_cpu_nb = {
.notifier_call = dummy_timer_cpu_notify,
};

static int __init dummy_timer_register(void)
{
int err = 0;

cpu_notifier_register_begin();
err = __register_cpu_notifier(&dummy_timer_cpu_nb);
if (err)
goto out;

/* We won't get a call on the boot CPU, so register immediately */
if (num_possible_cpus() > 1)
dummy_timer_setup();

out:
cpu_notifier_register_done();
return err;
return cpuhp_setup_state(CPUHP_AP_DUMMY_TIMER_STARTING,
"AP_DUMMY_TIMER_STARTING",
dummy_timer_starting_cpu, NULL);
}
early_initcall(dummy_timer_register);
1 change: 1 addition & 0 deletions include/linux/cpuhotplug.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ enum cpuhp_state {
CPUHP_AP_ARM_VFP_STARTING,
CPUHP_AP_PERF_ARM_STARTING,
CPUHP_AP_ARM_ARCH_TIMER_STARTING,
CPUHP_AP_DUMMY_TIMER_STARTING,
CPUHP_AP_KVM_STARTING,
CPUHP_AP_NOTIFY_STARTING,
CPUHP_AP_ONLINE,
Expand Down

0 comments on commit 00c1d17

Please sign in to comment.