Date: Mon, 14 Nov 2011 19:32:05 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r227510 - head/sys/geom Message-ID: <201111141932.pAEJW5wn063250@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111141932.pAEJW5wn063250>