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

Commit 559569ac authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Ingo Molnar
Browse files

rcu: Adjust force_quiescent_state() locking, step 2



This patch releases rnp->lock after the end of
force_quiescent_state()'s switch statement.  This is a second
step towards prohibiting starting grace periods while
force_quiescent_state() is executing, which will reduce the
number and complexity of races that force_quiescent_state() is
involved in.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <12626465501994-git-send-email->
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f96e9232
Loading
Loading
Loading
Loading
+3 −10
Original line number Original line Diff line number Diff line
@@ -1219,7 +1219,6 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)
	case RCU_GP_IDLE:
	case RCU_GP_IDLE:
	case RCU_GP_INIT:
	case RCU_GP_INIT:


		spin_unlock(&rnp->lock);
		break; /* grace period idle or initializing, ignore. */
		break; /* grace period idle or initializing, ignore. */


	case RCU_SAVE_DYNTICK:
	case RCU_SAVE_DYNTICK:
@@ -1246,10 +1245,8 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)
			rsp->completed_fqs = lastcomp;
			rsp->completed_fqs = lastcomp;
			forcenow = signaled == RCU_SAVE_COMPLETED;
			forcenow = signaled == RCU_SAVE_COMPLETED;
		}
		}
		if (!forcenow) {
		if (!forcenow)
			spin_unlock(&rnp->lock);
			break;
			break;
		}
		/* fall into next case. */
		/* fall into next case. */


	case RCU_FORCE_QS:
	case RCU_FORCE_QS:
@@ -1262,14 +1259,10 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)


		/* Leave state in case more forcing is required. */
		/* Leave state in case more forcing is required. */


		break;
		spin_lock(&rnp->lock);

	default:

		spin_unlock(&rnp->lock);
		WARN_ON_ONCE(1);
		break;
		break;
	}
	}
	spin_unlock(&rnp->lock);
unlock_fqs_ret:
unlock_fqs_ret:
	spin_unlock_irqrestore(&rsp->fqslock, flags);
	spin_unlock_irqrestore(&rsp->fqslock, flags);
}
}