rcu: Bind RCU grace-period kthreads if NO_HZ_FULL
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 1 Apr 2014 18:20:36 +0000 (11:20 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 29 Apr 2014 15:45:19 +0000 (08:45 -0700)
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>
kernel/rcu/tree_plugin.h

index 1af19e0..045c6d0 100644 (file)
@@ -2595,20 +2595,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp)
        return rsp == rcu_sysidle_state;
 }
 
-/*
- * Bind the grace-period kthread for the sysidle flavor of RCU to the
- * timekeeping CPU.
- */
-static void rcu_bind_gp_kthread(void)
-{
-       int cpu = ACCESS_ONCE(tick_do_timer_cpu);
-
-       if (cpu < 0 || cpu >= nr_cpu_ids)
-               return;
-       if (raw_smp_processor_id() != cpu)
-               set_cpus_allowed_ptr(current, cpumask_of(cpu));
-}
-
 /*
  * Return a delay in jiffies based on the number of CPUs, rcu_node
  * leaf fanout, and jiffies tick rate.  The idea is to allow larger
@@ -2819,10 +2805,6 @@ static bool is_sysidle_rcu_state(struct rcu_state *rsp)
        return false;
 }
 
-static void rcu_bind_gp_kthread(void)
-{
-}
-
 static void rcu_sysidle_report_gp(struct rcu_state *rsp, int isidle,
                                  unsigned long maxj)
 {
@@ -2853,3 +2835,19 @@ static bool rcu_nohz_full_cpu(struct rcu_state *rsp)
 #endif /* #ifdef CONFIG_NO_HZ_FULL */
        return 0;
 }
+
+/*
+ * Bind the grace-period kthread for the sysidle flavor of RCU to the
+ * timekeeping CPU.
+ */
+static void rcu_bind_gp_kthread(void)
+{
+#ifdef CONFIG_NO_HZ_FULL
+       int cpu = ACCESS_ONCE(tick_do_timer_cpu);
+
+       if (cpu < 0 || cpu >= nr_cpu_ids)
+               return;
+       if (raw_smp_processor_id() != cpu)
+               set_cpus_allowed_ptr(current, cpumask_of(cpu));
+#endif /* #ifdef CONFIG_NO_HZ_FULL */
+}