diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-11-17 13:35:34 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-11-22 17:34:41 -0500 |
commit | 31eff2434db542763a00074a8368d7bd78d14ea1 (patch) | |
tree | bca062834d5098723d4d31428346a8bf23eb1de1 | |
parent | 38b482929e8f96dfe459d2ef757d0a5c3a74cea3 (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.c | 33 |
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 | ||
393 | static int tick_nohz_cpu_down_callback(struct notifier_block *nfb, | 393 | static 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 | ||
413 | static int tick_nohz_init_all(void) | 405 | static int tick_nohz_init_all(void) |
@@ -428,7 +420,7 @@ static int tick_nohz_init_all(void) | |||
428 | 420 | ||
429 | void __init tick_nohz_init(void) | 421 | void __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 | ||