D.3.8.2 Handling Offline and Holdout CPUs

Figure: Handling Offline and Holdout CPUs
\begin{figure}{ \scriptsize
\begin{verbatim}1 static int rcu_implicit_offline...
...hed();
11 rdp->resched_ipi++;
12 return 0;
13 }\end{verbatim}
}\end{figure}

Figure [*] shows the code for rcu_implicit_offline_qs(), which checks for offline CPUs and forcing online holdout CPUs to enter a quiescent state.

Line 3 checks to see if the specified CPU is offline, and, if so, line 4 increments statistical counter ->offline_fqs (which is used only for tracing), and line 5 returns non-zero to indicate that the CPU is in an extended quiescent state.

Otherwise, the CPU is online, not in dynticks-idle mode (or this function would not have been called in the first place), and has not yet passed through a quiescent state for this grace period. Line 7 checks to see if the holdout CPU is the current running CPU, and, if not, line 8 sends the holdout CPU a reschedule IPI. Otherwise, line 10 sets the TIF_NEED_RESCHED flag for the current task, forcing the current CPU into the scheduler. In either case, the CPU should then quickly enter a quiescent state. Line 11 increments statistical counter resched_ipi, which is again used only for tracing. Finally, line 12 returns zero to indicate that the holdout CPU is still refusing to pass through a quiescent state.

Paul E. McKenney 2011-12-16