svn commit: r356192 - head/sys/geom

Alexander Motin mav at FreeBSD.org
Mon Dec 30 00:46:11 UTC 2019


Author: mav
Date: Mon Dec 30 00:46:10 2019
New Revision: 356192
URL: https://svnweb.freebsd.org/changeset/base/356192

Log:
  Retire nstart/nend counters.
  
  Those counters were abused for decade to workaround broken orphanization
  process in different classes by delaying the call while there are active
  requests.  But from one side it did not close all the races, while from
  another was quite expensive on SMP due to trashing twice per request cache
  lines of consumer and provider and requiring locks.  It lost its sense
  after I manually went through all the GEOM classes in base and made
  orphanization wait for either provider close or request completion.
  
  Consumer counters are still used under INVARIANTS to detect premature
  consumer close and detach.  Provider counters are removed completely.
  
  Sponsored by:	iXsystems, Inc.

Modified:
  head/sys/geom/geom.h
  head/sys/geom/geom_event.c
  head/sys/geom/geom_io.c
  head/sys/geom/geom_subr.c

Modified: head/sys/geom/geom.h
==============================================================================
--- head/sys/geom/geom.h	Mon Dec 30 00:16:58 2019	(r356191)
+++ head/sys/geom/geom.h	Mon Dec 30 00:46:10 2019	(r356192)
@@ -218,7 +218,8 @@ struct g_provider {
 	off_t			stripesize;
 	off_t			stripeoffset;
 	struct devstat		*stat;
-	u_int			nstart, nend;
+	u_int			spare1;
+	u_int			spare2;
 	u_int			flags;
 #define G_PF_WITHER		0x2
 #define G_PF_ORPHAN		0x4

Modified: head/sys/geom/geom_event.c
==============================================================================
--- head/sys/geom/geom_event.c	Mon Dec 30 00:16:58 2019	(r356191)
+++ head/sys/geom/geom_event.c	Mon Dec 30 00:46:10 2019	(r356192)
@@ -241,10 +241,7 @@ one_event(void)
 
 	g_topology_assert();
 	mtx_lock(&g_eventlock);
-	TAILQ_FOREACH(pp, &g_doorstep, orphan) {
-		if (pp->nstart == pp->nend)
-			break;
-	}
+	pp = TAILQ_FIRST(&g_doorstep);
 	if (pp != NULL) {
 		G_VALID_PROVIDER(pp);
 		TAILQ_REMOVE(&g_doorstep, pp, orphan);
@@ -299,7 +296,7 @@ g_run_events()
 		} else {
 			g_topology_unlock();
 			msleep(&g_wait_event, &g_eventlock, PRIBIO | PDROP,
-			    "-", TAILQ_EMPTY(&g_doorstep) ? 0 : hz / 10);
+			    "-", 0);
 		}
 	}
 	/* NOTREACHED */

Modified: head/sys/geom/geom_io.c
==============================================================================
--- head/sys/geom/geom_io.c	Mon Dec 30 00:16:58 2019	(r356191)
+++ head/sys/geom/geom_io.c	Mon Dec 30 00:46:10 2019	(r356192)
@@ -580,8 +580,9 @@ g_io_request(struct bio *bp, struct g_consumer *cp)
 		devstat_start_transaction(pp->stat, &bp->bio_t0);
 	if (g_collectstats & G_STATS_CONSUMERS)
 		devstat_start_transaction(cp->stat, &bp->bio_t0);
-	pp->nstart++;
+#ifdef INVARIANTS
 	cp->nstart++;
+#endif
 	mtx_unlock(mtxp);
 
 	if (direct) {
@@ -691,8 +692,9 @@ g_io_deliver(struct bio *bp, int error)
 		devstat_end_transaction_bio_bt(pp->stat, bp, &now);
 	if (g_collectstats & G_STATS_CONSUMERS)
 		devstat_end_transaction_bio_bt(cp->stat, bp, &now);
+#ifdef INVARIANTS
 	cp->nend++;
-	pp->nend++;
+#endif
 	mtx_unlock(mtxp);
 
 	if (error != ENOMEM) {

Modified: head/sys/geom/geom_subr.c
==============================================================================
--- head/sys/geom/geom_subr.c	Mon Dec 30 00:16:58 2019	(r356191)
+++ head/sys/geom/geom_subr.c	Mon Dec 30 00:46:10 2019	(r356192)
@@ -939,6 +939,9 @@ g_access(struct g_consumer *cp, int dcr, int dcw, int 
 	KASSERT(cp->acw + dcw >= 0, ("access resulting in negative acw"));
 	KASSERT(cp->ace + dce >= 0, ("access resulting in negative ace"));
 	KASSERT(dcr != 0 || dcw != 0 || dce != 0, ("NOP access request"));
+	KASSERT(cp->acr + dcr != 0 || cp->acw + dcw != 0 ||
+	    cp->ace + dce != 0 || cp->nstart == cp->nend,
+	    ("Last close with active requests"));
 	KASSERT(gp->access != NULL, ("NULL geom->access"));
 
 	/*
@@ -1426,8 +1429,10 @@ db_show_geom_consumer(int indent, struct g_consumer *c
 		}
 		gprintln("  access:   r%dw%de%d", cp->acr, cp->acw, cp->ace);
 		gprintln("  flags:    0x%04x", cp->flags);
+#ifdef INVARIANTS
 		gprintln("  nstart:   %u", cp->nstart);
 		gprintln("  nend:     %u", cp->nend);
+#endif
 	} else {
 		gprintf("consumer: %p (%s), access=r%dw%de%d", cp,
 		    cp->provider != NULL ? cp->provider->name : "none",
@@ -1459,8 +1464,6 @@ db_show_geom_provider(int indent, struct g_provider *p
 		    provider_flags_to_string(pp, flags, sizeof(flags)),
 		    pp->flags);
 		gprintln("  error:        %d", pp->error);
-		gprintln("  nstart:       %u", pp->nstart);
-		gprintln("  nend:         %u", pp->nend);
 		if (LIST_EMPTY(&pp->consumers))
 			gprintln("  consumers:    none");
 	} else {


More information about the svn-src-all mailing list