aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcu
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-02-23 18:57:07 -0500
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-02-26 15:11:03 -0500
commit675da67f24e2d6d8df0cedf12e59085ed8bbf4e7 (patch)
treed28ff66c2700afaebf2888a723f022766ce4a48c /kernel/rcu
parentc517d838eb7d07bbe9507871fab3931deccff539 (diff)
rcu: Fixes to NO_HZ_FULL sysidle accounting
On second and subsequent passes through quiescent-state forcing, the isidle variable was initialized to false, which would prevent full sysidle state from being reached if a grace period needed more than one round of quiescent-state forcing (which most should not). However, the check for offline CPUs in the quiescent-state forcing main loop had the wrong sense, which could prevent CPUs from ever entering full sysidle state. This commit fixes both of these bugs. Given that sysidle is not yet wired up, this has no effect in old kernels, but might have proven frustrating had anyone attempted to wire it up. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcu')
-rw-r--r--kernel/rcu/tree.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 48d640ca1a05..735bd7ee749a 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1798,7 +1798,7 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in)
1798 fqs_state = RCU_FORCE_QS; 1798 fqs_state = RCU_FORCE_QS;
1799 } else { 1799 } else {
1800 /* Handle dyntick-idle and offline CPUs. */ 1800 /* Handle dyntick-idle and offline CPUs. */
1801 isidle = false; 1801 isidle = true;
1802 force_qs_rnp(rsp, rcu_implicit_dynticks_qs, &isidle, &maxj); 1802 force_qs_rnp(rsp, rcu_implicit_dynticks_qs, &isidle, &maxj);
1803 } 1803 }
1804 /* Clear flag to prevent immediate re-entry. */ 1804 /* Clear flag to prevent immediate re-entry. */
@@ -2596,8 +2596,8 @@ static void force_qs_rnp(struct rcu_state *rsp,
2596 bit = 1; 2596 bit = 1;
2597 for (; cpu <= rnp->grphi; cpu++, bit <<= 1) { 2597 for (; cpu <= rnp->grphi; cpu++, bit <<= 1) {
2598 if ((rnp->qsmask & bit) != 0) { 2598 if ((rnp->qsmask & bit) != 0) {
2599 if ((rnp->qsmaskinit & bit) != 0) 2599 if ((rnp->qsmaskinit & bit) == 0)
2600 *isidle = false; 2600 *isidle = false; /* Pending hotplug. */
2601 if (f(per_cpu_ptr(rsp->rda, cpu), isidle, maxj)) 2601 if (f(per_cpu_ptr(rsp->rda, cpu), isidle, maxj))
2602 mask |= bit; 2602 mask |= bit;
2603 } 2603 }