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