From owner-svn-src-head@FreeBSD.ORG Mon Nov 14 19:32:06 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 05FA9106564A; Mon, 14 Nov 2011 19:32:06 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D08828FC0A; Mon, 14 Nov 2011 19:32:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pAEJW5JA063252; Mon, 14 Nov 2011 19:32:05 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pAEJW5wn063250; Mon, 14 Nov 2011 19:32:05 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201111141932.pAEJW5wn063250@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Nov 2011 19:32:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227510 - head/sys/geom X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Nov 2011 19:32:06 -0000 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);