Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 121dfc4b authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: fine-tune grace-period begin/end checks



Use the CPU's bit in rnp->qsmask to determine whether or not the CPU
should try to report a quiescent state.  Handle overflow in the check
for rdp->gpnum having fallen behind.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 5ff8e6f0
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -617,9 +617,17 @@ static void __init check_cpu_stall_init(void)
static void __note_new_gpnum(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
{
	if (rdp->gpnum != rnp->gpnum) {
		/*
		 * If the current grace period is waiting for this CPU,
		 * set up to detect a quiescent state, otherwise don't
		 * go looking for one.
		 */
		rdp->gpnum = rnp->gpnum;
		if (rnp->qsmask & rdp->grpmask) {
			rdp->qs_pending = 1;
			rdp->passed_quiesc = 0;
		rdp->gpnum = rnp->gpnum;
		} else
			rdp->qs_pending = 0;
	}
}

@@ -681,19 +689,20 @@ __rcu_process_gp_end(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_dat

		/*
		 * If we were in an extended quiescent state, we may have
		 * missed some grace periods that others CPUs took care on
		 * missed some grace periods that others CPUs handled on
		 * our behalf. Catch up with this state to avoid noting
		 * spurious new grace periods.
		 * spurious new grace periods.  If another grace period
		 * has started, then rnp->gpnum will have advanced, so
		 * we will detect this later on.
		 */
		if (rdp->completed > rdp->gpnum)
		if (ULONG_CMP_LT(rdp->gpnum, rdp->completed))
			rdp->gpnum = rdp->completed;

		/*
		 * If another CPU handled our extended quiescent states and
		 * we have no more grace period to complete yet, then stop
		 * chasing quiescent states.
		 * If RCU does not need a quiescent state from this CPU,
		 * then make sure that this CPU doesn't go looking for one.
		 */
		if (rdp->completed == rnp->gpnum)
		if ((rnp->qsmask & rdp->grpmask) == 0)
			rdp->qs_pending = 0;
	}
}