aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2016-11-17 13:35:34 -0500
committerThomas Gleixner <tglx@linutronix.de>2016-11-22 17:34:41 -0500
commit31eff2434db542763a00074a8368d7bd78d14ea1 (patch)
treebca062834d5098723d4d31428346a8bf23eb1de1
parent38b482929e8f96dfe459d2ef757d0a5c3a74cea3 (diff)
sched/nohz: Convert to hotplug state machine
Install the callbacks via the state machine. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Cc: rt@linuxtronix.de Link: http://lkml.kernel.org/r/20161117183541.8588-14-bigeasy@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--kernel/time/tick-sched.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 3bcb61b52f6c..71496a20e670 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -390,24 +390,16 @@ static int __init tick_nohz_full_setup(char *str)
390} 390}
391__setup("nohz_full=", tick_nohz_full_setup); 391__setup("nohz_full=", tick_nohz_full_setup);
392 392
393static int tick_nohz_cpu_down_callback(struct notifier_block *nfb, 393static int tick_nohz_cpu_down(unsigned int cpu)
394 unsigned long action,
395 void *hcpu)
396{ 394{
397 unsigned int cpu = (unsigned long)hcpu; 395 /*
398 396 * The boot CPU handles housekeeping duty (unbound timers,
399 switch (action & ~CPU_TASKS_FROZEN) { 397 * workqueues, timekeeping, ...) on behalf of full dynticks
400 case CPU_DOWN_PREPARE: 398 * CPUs. It must remain online when nohz full is enabled.
401 /* 399 */
402 * The boot CPU handles housekeeping duty (unbound timers, 400 if (tick_nohz_full_running && tick_do_timer_cpu == cpu)
403 * workqueues, timekeeping, ...) on behalf of full dynticks 401 return -EBUSY;
404 * CPUs. It must remain online when nohz full is enabled. 402 return 0;
405 */
406 if (tick_nohz_full_running && tick_do_timer_cpu == cpu)
407 return NOTIFY_BAD;
408 break;
409 }
410 return NOTIFY_OK;
411} 403}
412 404
413static int tick_nohz_init_all(void) 405static int tick_nohz_init_all(void)
@@ -428,7 +420,7 @@ static int tick_nohz_init_all(void)
428 420
429void __init tick_nohz_init(void) 421void __init tick_nohz_init(void)
430{ 422{
431 int cpu; 423 int cpu, ret;
432 424
433 if (!tick_nohz_full_running) { 425 if (!tick_nohz_full_running) {
434 if (tick_nohz_init_all() < 0) 426 if (tick_nohz_init_all() < 0)
@@ -469,7 +461,10 @@ void __init tick_nohz_init(void)
469 for_each_cpu(cpu, tick_nohz_full_mask) 461 for_each_cpu(cpu, tick_nohz_full_mask)
470 context_tracking_cpu_set(cpu); 462 context_tracking_cpu_set(cpu);
471 463
472 cpu_notifier(tick_nohz_cpu_down_callback, 0); 464 ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
465 "kernel/nohz:predown", NULL,
466 tick_nohz_cpu_down);
467 WARN_ON(ret < 0);
473 pr_info("NO_HZ: Full dynticks CPUs: %*pbl.\n", 468 pr_info("NO_HZ: Full dynticks CPUs: %*pbl.\n",
474 cpumask_pr_args(tick_nohz_full_mask)); 469 cpumask_pr_args(tick_nohz_full_mask));
475 470