aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcu/tree_plugin.h
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2014-04-01 14:20:36 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2014-04-29 11:45:19 -0400
commit5057f55e543b7859cfd26bc281291795eac93f8a (patch)
tree37cf522d549037e6e31d57159d8ab7668e085715 /kernel/rcu/tree_plugin.h
parent71a9b26963f8c2d0df6f782e2b29ccefc22d4fba (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>
Diffstat (limited to 'kernel/rcu/tree_plugin.h')
-rw-r--r--kernel/rcu/tree_plugin.h34
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 */
2602static 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
2822static void rcu_bind_gp_kthread(void)
2823{
2824}
2825
2826static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle, 2808static 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 */
2843static 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}