svn commit: r227510 - head/sys/geom

Alexander Motin mav at FreeBSD.org
Mon Nov 14 19:32:06 UTC 2011


Author: mav
Date: Mon Nov 14 19:32:05 2011
New Revision: 227510
URL: http://svn.freebsd.org/changeset/base/227510

Log:
  Temporary revert r227009 to fix freeze on UP systems without PREEMPTION.
  
  Before r215687, if some withered geom or provider could not be destroyed,
  g_event thread went to sleep for 0.1s before retrying. After that change
  it is just restarting immediately. r227009 made orphaned (withered) provider
  to not detach immediately, but only after context switch. That made loop
  inside g_event thread infinite on UP systems without PREEMPTION.
  
  To address original problem with possible dead lock addressed by r227009
  we have to fix r215687 change first, that needs some time to think and test.

Modified:
  head/sys/geom/geom_dev.c

Modified: head/sys/geom/geom_dev.c
==============================================================================
--- head/sys/geom/geom_dev.c	Mon Nov 14 19:10:20 2011	(r227509)
+++ head/sys/geom/geom_dev.c	Mon Nov 14 19:32:05 2011	(r227510)
@@ -506,32 +506,6 @@ g_dev_strategy(struct bio *bp)
  */
 
 static void
-g_dev_cleanup(void *arg)
-{
-	struct g_geom *gp;
-	struct g_consumer *cp;
-
-	mtx_unlock(&Giant);
-	cp = arg;
-	gp = cp->geom;
-	g_trace(G_T_TOPOLOGY, "g_dev_cleanup(%p(%s))", cp, cp->provider->name);
-
-	/* Wait for the cows to come home */
-	while (cp->nstart != cp->nend)
-		pause("gdevcleanup", hz / 10);
-
-	g_topology_lock();
-	if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0)
-		g_access(cp, -cp->acr, -cp->acw, -cp->ace);
-
-	g_detach(cp);
-	g_destroy_consumer(cp);
-	g_destroy_geom(gp);
-	g_topology_unlock();
-	mtx_lock(&Giant);
-}
-
-static void
 g_dev_orphan(struct g_consumer *cp)
 {
 	struct g_geom *gp;
@@ -547,7 +521,18 @@ g_dev_orphan(struct g_consumer *cp)
 		set_dumper(NULL);
 
 	/* Destroy the struct cdev *so we get no more requests */
-	destroy_dev_sched_cb(dev, g_dev_cleanup, cp);
+	destroy_dev(dev);
+
+	/* Wait for the cows to come home */
+	while (cp->nstart != cp->nend)
+		pause("gdevorphan", hz / 10);
+
+	if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0)
+		g_access(cp, -cp->acr, -cp->acw, -cp->ace);
+
+	g_detach(cp);
+	g_destroy_consumer(cp);
+	g_destroy_geom(gp);
 }
 
 DECLARE_GEOM_CLASS(g_dev_class, g_dev);


More information about the svn-src-all mailing list