sum of CBMs is fixed, that means actual `cos_max` in use will automatically
reduce to half when CDP is enabled.
+### rcu-idle-timer-period-ms
+> `= <integer>`
+
+> Default: `10`
+
+How frequently a CPU which has gone idle, but with pending RCU callbacks,
+should be woken up to check if the grace period has completed, and the
+callbacks are safe to be executed. Expressed in milliseconds; maximum is
+100, and it can't be 0.
+
### reboot
> `= t[riple] | k[bd] | a[cpi] | p[ci] | P[ower] | e[fi] | n[o] [, [w]arm | [c]old]`
* About how far in the future the timer should be programmed each time,
* it's hard to tell (guess!!). Since this mimics Linux's periodic timer
* tick, take values used there as an indication. In Linux 2.6.21, tick
- * period can be 10ms, 4ms, 3.33ms or 1ms. Let's use 10ms, to enable
- * at least some power saving on the CPU that is going idle.
+ * period can be 10ms, 4ms, 3.33ms or 1ms.
+ *
+ * By default, we use 10ms, to enable at least some power saving on the
+ * CPU that is going idle. The user can change this, via a boot time
+ * parameter, but only up to 100ms.
*/
-#define RCU_IDLE_TIMER_PERIOD MILLISECS(10)
+#define IDLE_TIMER_PERIOD_MAX MILLISECS(100)
+#define IDLE_TIMER_PERIOD_DEFAULT MILLISECS(10)
+
+static s_time_t __read_mostly idle_timer_period;
static DEFINE_PER_CPU(struct rcu_data, rcu_data);
if (likely(!rdp->curlist))
return;
- set_timer(&rdp->idle_timer, NOW() + RCU_IDLE_TIMER_PERIOD);
+ set_timer(&rdp->idle_timer, NOW() + idle_timer_period);
rdp->idle_timer_active = true;
}
void __init rcu_init(void)
{
void *cpu = (void *)(long)smp_processor_id();
+ static unsigned int __initdata idle_timer_period_ms =
+ IDLE_TIMER_PERIOD_DEFAULT / MILLISECS(1);
+ integer_param("rcu-idle-timer-period-ms", idle_timer_period_ms);
+
+ /* We don't allow 0, or anything higher than IDLE_TIMER_PERIOD_MAX */
+ if ( idle_timer_period_ms == 0 ||
+ idle_timer_period_ms > IDLE_TIMER_PERIOD_MAX / MILLISECS(1) )
+ {
+ idle_timer_period_ms = IDLE_TIMER_PERIOD_DEFAULT / MILLISECS(1);
+ printk("WARNING: rcu-idle-timer-period-ms outside of "
+ "(0,%"PRI_stime"]. Resetting it to %u.\n",
+ IDLE_TIMER_PERIOD_MAX / MILLISECS(1), idle_timer_period_ms);
+ }
+ idle_timer_period = MILLISECS(idle_timer_period_ms);
cpumask_clear(&rcu_ctrlblk.idle_cpumask);
cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);