Commit df2bf8f7 authored by Joel Fernandes (Google)'s avatar Joel Fernandes (Google) Committed by Paul E. McKenney
Browse files

rcu: Use better variable names in funnel locking loop

The funnel locking loop in rcu_start_this_gp uses rcu_root as a
temporary variable while walking the combining tree. This causes a
tiresome exercise of a code reader reminding themselves that rcu_root
may not be root. Lets just call it rnp, and rename other variables as
well to be more appropriate.

Original patch: https://patchwork.kernel.org/patch/10396577/



Signed-off-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
[ paulmck: Fix name in comment as well. ]
parent b73de91d
Loading
Loading
Loading
Loading
+32 −32
Original line number Diff line number Diff line
@@ -1554,7 +1554,7 @@ static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,

/*
 * rcu_start_this_gp - Request the start of a particular grace period
 * @rnp: The leaf node of the CPU from which to start.
 * @rnp_start: The leaf node of the CPU from which to start.
 * @rdp: The rcu_data corresponding to the CPU from which to start.
 * @gp_seq_req: The gp_seq of the grace period to start.
 *
@@ -1568,74 +1568,74 @@ static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
 *
 * Returns true if the GP thread needs to be awakened else false.
 */
static bool rcu_start_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
			      unsigned long gp_seq_req)
{
	bool ret = false;
	struct rcu_state *rsp = rdp->rsp;
	struct rcu_node *rnp_root;
	struct rcu_node *rnp;

	/*
	 * Use funnel locking to either acquire the root rcu_node
	 * structure's lock or bail out if the need for this grace period
	 * has already been recorded -- or has already started.  If there
	 * is already a grace period in progress in a non-leaf node, no
	 * recording is needed because the end of the grace period will
	 * scan the leaf rcu_node structures.  Note that rnp->lock must
	 * not be released.
	 */
	raw_lockdep_assert_held_rcu_node(rnp);
	trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startleaf"));
	for (rnp_root = rnp; 1; rnp_root = rnp_root->parent) {
		if (rnp_root != rnp)
			raw_spin_lock_rcu_node(rnp_root);
		if (ULONG_CMP_GE(rnp_root->gp_seq_needed, gp_seq_req) ||
		    rcu_seq_started(&rnp_root->gp_seq, gp_seq_req) ||
		    (rnp != rnp_root &&
		     rcu_seq_state(rcu_seq_current(&rnp_root->gp_seq)))) {
			trace_rcu_this_gp(rnp_root, rdp, gp_seq_req,
	 * has already been recorded -- or if that grace period has in
	 * fact already started.  If there is already a grace period in
	 * progress in a non-leaf node, no recording is needed because the
	 * end of the grace period will scan the leaf rcu_node structures.
	 * Note that rnp_start->lock must not be released.
	 */
	raw_lockdep_assert_held_rcu_node(rnp_start);
	trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf"));
	for (rnp = rnp_start; 1; rnp = rnp->parent) {
		if (rnp != rnp_start)
			raw_spin_lock_rcu_node(rnp);
		if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) ||
		    rcu_seq_started(&rnp->gp_seq, gp_seq_req) ||
		    (rnp != rnp_start &&
		     rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) {
			trace_rcu_this_gp(rnp, rdp, gp_seq_req,
					  TPS("Prestarted"));
			goto unlock_out;
		}
		rnp_root->gp_seq_needed = gp_seq_req;
		if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) {
		rnp->gp_seq_needed = gp_seq_req;
		if (rcu_seq_state(rcu_seq_current(&rnp_start->gp_seq))) {
			/*
			 * We just marked the leaf, and a grace period
			 * is in progress, which means that rcu_gp_cleanup()
			 * will see the marking.  Bail to reduce contention.
			 */
			trace_rcu_this_gp(rnp, rdp, gp_seq_req,
			trace_rcu_this_gp(rnp_start, rdp, gp_seq_req,
					  TPS("Startedleaf"));
			goto unlock_out;
		}
		if (rnp_root != rnp && rnp_root->parent != NULL)
			raw_spin_unlock_rcu_node(rnp_root);
		if (!rnp_root->parent)
		if (rnp != rnp_start && rnp->parent != NULL)
			raw_spin_unlock_rcu_node(rnp);
		if (!rnp->parent)
			break;  /* At root, and perhaps also leaf. */
	}

	/* If GP already in progress, just leave, otherwise start one. */
	if (rcu_gp_in_progress(rsp)) {
		trace_rcu_this_gp(rnp_root, rdp, gp_seq_req, TPS("Startedleafroot"));
		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot"));
		goto unlock_out;
	}
	trace_rcu_this_gp(rnp_root, rdp, gp_seq_req, TPS("Startedroot"));
	trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot"));
	WRITE_ONCE(rsp->gp_flags, rsp->gp_flags | RCU_GP_FLAG_INIT);
	rsp->gp_req_activity = jiffies;
	if (!rsp->gp_kthread) {
		trace_rcu_this_gp(rnp_root, rdp, gp_seq_req, TPS("NoGPkthread"));
		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread"));
		goto unlock_out;
	}
	trace_rcu_grace_period(rsp->name, READ_ONCE(rsp->gp_seq), TPS("newreq"));
	ret = true;  /* Caller must wake GP kthread. */
unlock_out:
	/* Push furthest requested GP to leaf node and rcu_data structure. */
	if (ULONG_CMP_LT(gp_seq_req, rnp_root->gp_seq_needed)) {
		rnp->gp_seq_needed = rnp_root->gp_seq_needed;
		rdp->gp_seq_needed = rnp_root->gp_seq_needed;
	if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) {
		rnp_start->gp_seq_needed = rnp->gp_seq_needed;
		rdp->gp_seq_needed = rnp->gp_seq_needed;
	}
	if (rnp != rnp_root)
		raw_spin_unlock_rcu_node(rnp_root);
	if (rnp != rnp_start)
		raw_spin_unlock_rcu_node(rnp);
	return ret;
}