Skip to content

Commit dd7dafd

Browse files
committed
rcu: Make kernel-mode nohz_full CPUs invoke the RCU core processing
If a nohz_full CPU is idle or executing in userspace, it makes good sense to keep it out of RCU core processing. After all, the RCU grace-period kthread can see its quiescent states and all of its callbacks are offloaded, so there is nothing for RCU core processing to do. However, if a nohz_full CPU is executing in kernel space, the RCU grace-period kthread cannot do anything for it, so such a CPU must report its own quiescent states. This commit therefore makes nohz_full CPUs skip RCU core processing only if the scheduler-clock interrupt caught them in idle or in userspace. Signed-off-by: Paul E. McKenney <[email protected]>
1 parent ed93dfc commit dd7dafd

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

kernel/rcu/tree.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ module_param_cb(jiffies_till_next_fqs, &next_fqs_jiffies_ops, &jiffies_till_next
497497
module_param(rcu_kick_kthreads, bool, 0644);
498498

499499
static void force_qs_rnp(int (*f)(struct rcu_data *rdp));
500-
static int rcu_pending(void);
500+
static int rcu_pending(int user);
501501

502502
/*
503503
* Return the number of RCU GPs completed thus far for debug & stats.
@@ -2267,7 +2267,7 @@ void rcu_sched_clock_irq(int user)
22672267
__this_cpu_write(rcu_data.rcu_urgent_qs, false);
22682268
}
22692269
rcu_flavor_sched_clock_irq(user);
2270-
if (rcu_pending())
2270+
if (rcu_pending(user))
22712271
invoke_rcu_core();
22722272

22732273
trace_rcu_utilization(TPS("End scheduler-tick"));
@@ -2816,7 +2816,7 @@ EXPORT_SYMBOL_GPL(cond_synchronize_rcu);
28162816
* CPU-local state are performed first. However, we must check for CPU
28172817
* stalls first, else we might not get a chance.
28182818
*/
2819-
static int rcu_pending(void)
2819+
static int rcu_pending(int user)
28202820
{
28212821
bool gp_in_progress;
28222822
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
@@ -2829,8 +2829,8 @@ static int rcu_pending(void)
28292829
if (rcu_nocb_need_deferred_wakeup(rdp))
28302830
return 1;
28312831

2832-
/* Is this CPU a NO_HZ_FULL CPU that should ignore RCU? */
2833-
if (rcu_nohz_full_cpu())
2832+
/* Is this a nohz_full CPU in userspace or idle? (Ignore RCU if so.) */
2833+
if ((user || rcu_is_cpu_rrupt_from_idle()) && rcu_nohz_full_cpu())
28342834
return 0;
28352835

28362836
/* Is the RCU core waiting for a quiescent state from this CPU? */

0 commit comments

Comments
 (0)