|
@@ -226,6 +226,12 @@ int rcu_cpu_stall_timeout __read_mostly = CONFIG_RCU_CPU_STALL_TIMEOUT;
|
|
|
module_param(rcu_cpu_stall_suppress, int, 0644);
|
|
|
module_param(rcu_cpu_stall_timeout, int, 0644);
|
|
|
|
|
|
+static ulong jiffies_till_first_fqs = RCU_JIFFIES_TILL_FORCE_QS;
|
|
|
+static ulong jiffies_till_next_fqs = RCU_JIFFIES_TILL_FORCE_QS;
|
|
|
+
|
|
|
+module_param(jiffies_till_first_fqs, ulong, 0644);
|
|
|
+module_param(jiffies_till_next_fqs, ulong, 0644);
|
|
|
+
|
|
|
static void force_qs_rnp(struct rcu_state *rsp, int (*f)(struct rcu_data *));
|
|
|
static void force_quiescent_state(struct rcu_state *rsp);
|
|
|
static int rcu_pending(int cpu);
|
|
@@ -1177,6 +1183,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
|
|
|
static int __noreturn rcu_gp_kthread(void *arg)
|
|
|
{
|
|
|
int fqs_state;
|
|
|
+ unsigned long j;
|
|
|
int ret;
|
|
|
struct rcu_state *rsp = arg;
|
|
|
struct rcu_node *rnp = rcu_get_root(rsp);
|
|
@@ -1197,14 +1204,18 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
|
|
|
|
|
/* Handle quiescent-state forcing. */
|
|
|
fqs_state = RCU_SAVE_DYNTICK;
|
|
|
+ j = jiffies_till_first_fqs;
|
|
|
+ if (j > HZ) {
|
|
|
+ j = HZ;
|
|
|
+ jiffies_till_first_fqs = HZ;
|
|
|
+ }
|
|
|
for (;;) {
|
|
|
- rsp->jiffies_force_qs = jiffies +
|
|
|
- RCU_JIFFIES_TILL_FORCE_QS;
|
|
|
+ rsp->jiffies_force_qs = jiffies + j;
|
|
|
ret = wait_event_interruptible_timeout(rsp->gp_wq,
|
|
|
(rsp->gp_flags & RCU_GP_FLAG_FQS) ||
|
|
|
(!ACCESS_ONCE(rnp->qsmask) &&
|
|
|
!rcu_preempt_blocked_readers_cgp(rnp)),
|
|
|
- RCU_JIFFIES_TILL_FORCE_QS);
|
|
|
+ j);
|
|
|
/* If grace period done, leave loop. */
|
|
|
if (!ACCESS_ONCE(rnp->qsmask) &&
|
|
|
!rcu_preempt_blocked_readers_cgp(rnp))
|
|
@@ -1218,6 +1229,14 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
|
|
cond_resched();
|
|
|
flush_signals(current);
|
|
|
}
|
|
|
+ j = jiffies_till_next_fqs;
|
|
|
+ if (j > HZ) {
|
|
|
+ j = HZ;
|
|
|
+ jiffies_till_next_fqs = HZ;
|
|
|
+ } else if (j < 1) {
|
|
|
+ j = 1;
|
|
|
+ jiffies_till_next_fqs = 1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Handle grace-period end. */
|