Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Sep 2020 18:18:05 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r365333 - head/sys/cam
Message-ID:  <202009041818.084II5HI095045@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Fri Sep  4 18:18:05 2020
New Revision: 365333
URL: https://svnweb.freebsd.org/changeset/base/365333

Log:
  cam_sim: harmonize code related to acquiring a mtx
  
  cam_sim_free(), cam_sim_release(), and cam_sim_hold() all assign
  a mtx variable during declaration and then if NULL or the mtx is
  held may re-asign the variable and/or acquire/release a lock.
  
  Harmonize the code, avoiding double assignments and make it look
  the same for all three function (with cam_sim_free() not needing
  an extra case).
  
  No functional changes intended.
  
  Reviewed by:	imp; no-objections by: mav
  MFC after:	3 days
  Differential Revision:	https://reviews.freebsd.org/D26286

Modified:
  head/sys/cam/cam_sim.c

Modified: head/sys/cam/cam_sim.c
==============================================================================
--- head/sys/cam/cam_sim.c	Fri Sep  4 17:37:58 2020	(r365332)
+++ head/sys/cam/cam_sim.c	Fri Sep  4 18:18:05 2020	(r365333)
@@ -124,14 +124,15 @@ cam_sim_alloc_dev(sim_action_func sim_action, sim_poll
 void
 cam_sim_free(struct cam_sim *sim, int free_devq)
 {
-	struct mtx *mtx = sim->mtx;
+	struct mtx *mtx;
 	int error;
 
-	if (mtx) {
-		mtx_assert(mtx, MA_OWNED);
-	} else {
+	if (sim->mtx == NULL) {
 		mtx = &cam_sim_free_mtx;
 		mtx_lock(mtx);
+	} else {
+		mtx = sim->mtx;
+		mtx_assert(mtx, MA_OWNED);
 	}
 	sim->refcount--;
 	if (sim->refcount > 0) {
@@ -139,7 +140,7 @@ cam_sim_free(struct cam_sim *sim, int free_devq)
 		KASSERT(error == 0, ("invalid error value for msleep(9)"));
 	}
 	KASSERT(sim->refcount == 0, ("sim->refcount == 0"));
-	if (sim->mtx == NULL)
+	if (mtx == &cam_sim_free_mtx)	/* sim->mtx == NULL */
 		mtx_unlock(mtx);
 
 	if (free_devq)
@@ -150,17 +151,16 @@ cam_sim_free(struct cam_sim *sim, int free_devq)
 void
 cam_sim_release(struct cam_sim *sim)
 {
-	struct mtx *mtx = sim->mtx;
+	struct mtx *mtx;
 
-	if (mtx) {
-		if (!mtx_owned(mtx))
-			mtx_lock(mtx);
-		else
-			mtx = NULL;
-	} else {
+	if (sim->mtx == NULL)
 		mtx = &cam_sim_free_mtx;
+	else if (!mtx_owned(sim->mtx))
+		mtx = sim->mtx;
+	else
+		mtx = NULL;	/* We hold the lock. */
+	if (mtx)
 		mtx_lock(mtx);
-	}
 	KASSERT(sim->refcount >= 1, ("sim->refcount >= 1"));
 	sim->refcount--;
 	if (sim->refcount == 0)
@@ -172,17 +172,16 @@ cam_sim_release(struct cam_sim *sim)
 void
 cam_sim_hold(struct cam_sim *sim)
 {
-	struct mtx *mtx = sim->mtx;
+	struct mtx *mtx;
 
-	if (mtx) {
-		if (!mtx_owned(mtx))
-			mtx_lock(mtx);
-		else
-			mtx = NULL;
-	} else {
+	if (sim->mtx == NULL)
 		mtx = &cam_sim_free_mtx;
+	else if (!mtx_owned(sim->mtx))
+		mtx = sim->mtx;
+	else
+		mtx = NULL;	/* We hold the lock. */
+	if (mtx)
 		mtx_lock(mtx);
-	}
 	KASSERT(sim->refcount >= 1, ("sim->refcount >= 1"));
 	sim->refcount++;
 	if (mtx)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202009041818.084II5HI095045>