diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-04-01 14:20:36 -0400 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-04-29 11:45:19 -0400 |
| commit | 5057f55e543b7859cfd26bc281291795eac93f8a (patch) | |
| tree | 37cf522d549037e6e31d57159d8ab7668e085715 | |
| parent | 71a9b26963f8c2d0df6f782e2b29ccefc22d4fba (diff) | |
rcu: Bind RCU grace-period kthreads if NO_HZ_FULL
Currently, RCU binds the grace-period kthreads to the timekeeping
CPU only if CONFIG_NO_HZ_FULL_SYSIDLE=y. This means that these
kthreads must be bound manually when CONFIG_NO_HZ_FULL_SYSIDLE=n and
CONFIG_NO_HZ_FULL=y: Otherwise, these kthreads will induce OS jitter on
random CPUs. Given that we are trying to reduce the amount of manual
tweaking required to make CONFIG_NO_HZ_FULL=y work nicely, this commit
makes this binding happen when CONFIG_NO_HZ_FULL=y, even in cases where
CONFIG_NO_HZ_FULL_SYSIDLE=n.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
| -rw-r--r-- | kernel/rcu/tree_plugin.h | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 1af19e006899..045c6d04ed3f 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h | |||
| @@ -2596,20 +2596,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp) | |||
| 2596 | } | 2596 | } |
| 2597 | 2597 | ||
| 2598 | /* | 2598 | /* |
| 2599 | * Bind the grace-period kthread for the sysidle flavor of RCU to the | ||
| 2600 | * timekeeping CPU. | ||
| 2601 | */ | ||
| 2602 | static void rcu_bind_gp_kthread(void) | ||
| 2603 | { | ||
| 2604 | int cpu = ACCESS_ONCE(tick_do_timer_cpu); | ||
| 2605 | |||
| 2606 | if (cpu < 0 || cpu >= nr_cpu_ids) | ||
| 2607 | return; | ||
| 2608 | if (raw_smp_processor_id() != cpu) | ||
| 2609 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
| 2610 | } | ||
| 2611 | |||
| 2612 | /* | ||
| 2613 | * Return a delay in jiffies based on the number of CPUs, rcu_node | 2599 | * Return a delay in jiffies based on the number of CPUs, rcu_node |
| 2614 | * leaf fanout, and jiffies tick rate. The idea is to allow larger | 2600 | * leaf fanout, and jiffies tick rate. The idea is to allow larger |
| 2615 | * systems more time to transition to full-idle state in order to | 2601 | * systems more time to transition to full-idle state in order to |
| @@ -2819,10 +2805,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp) | |||
| 2819 | return false; | 2805 | return false; |
| 2820 | } | 2806 | } |
| 2821 | 2807 | ||
| 2822 | static void rcu_bind_gp_kthread(void) | ||
| 2823 | { | ||
| 2824 | } | ||
| 2825 | |||
| 2826 | static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle, | 2808 | static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle, |
| 2827 | unsigned long maxj) | 2809 | unsigned long maxj) |
| 2828 | { | 2810 | { |
| @@ -2853,3 +2835,19 @@ static bool rcu_nohz_full_cpu(struct rcu_state *rsp) | |||
| 2853 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | 2835 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ |
| 2854 | return 0; | 2836 | return 0; |
| 2855 | } | 2837 | } |
| 2838 | |||
| 2839 | /* | ||
| 2840 | * Bind the grace-period kthread for the sysidle flavor of RCU to the | ||
| 2841 | * timekeeping CPU. | ||
| 2842 | */ | ||
| 2843 | static void rcu_bind_gp_kthread(void) | ||
| 2844 | { | ||
| 2845 | #ifdef CONFIG_NO_HZ_FULL | ||
| 2846 | int cpu = ACCESS_ONCE(tick_do_timer_cpu); | ||
| 2847 | |||
| 2848 | if (cpu < 0 || cpu >= nr_cpu_ids) | ||
| 2849 | return; | ||
| 2850 | if (raw_smp_processor_id() != cpu) | ||
| 2851 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
| 2852 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | ||
| 2853 | } | ||
