From owner-svn-src-stable@FreeBSD.ORG Sun Aug 8 09:12:30 2010 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7E7781065670; Sun, 8 Aug 2010 09:12:30 +0000 (UTC) (envelope-from jh@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6C8E58FC1D; Sun, 8 Aug 2010 09:12:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o789CUBv019058; Sun, 8 Aug 2010 09:12:30 GMT (envelope-from jh@svn.freebsd.org) Received: (from jh@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o789CUpd019053; Sun, 8 Aug 2010 09:12:30 GMT (envelope-from jh@svn.freebsd.org) Message-Id: <201008080912.o789CUpd019053@svn.freebsd.org> From: Jaakko Heinonen Date: Sun, 8 Aug 2010 09:12:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211065 - stable/8/sys/geom/vinum X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Aug 2010 09:12:30 -0000 Author: jh Date: Sun Aug 8 09:12:30 2010 New Revision: 211065 URL: http://svn.freebsd.org/changeset/base/211065 Log: MFC r207878: - Don't return EAGAIN from gv_unload(). It was used to work around the deadlock fixed in r207671. - Wait for worker process to exit at class unload. The worker process was not guaranteed to exit before the linker unloaded the module. - Use 0 as the worker process exit status instead of ENXIO and style the NOTREACHED comment. Modified: stable/8/sys/geom/vinum/geom_vinum.c stable/8/sys/geom/vinum/geom_vinum.h stable/8/sys/geom/vinum/geom_vinum_events.c stable/8/sys/geom/vinum/geom_vinum_var.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cam/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) Modified: stable/8/sys/geom/vinum/geom_vinum.c ============================================================================== --- stable/8/sys/geom/vinum/geom_vinum.c Sun Aug 8 09:06:59 2010 (r211064) +++ stable/8/sys/geom/vinum/geom_vinum.c Sun Aug 8 09:12:30 2010 (r211065) @@ -187,7 +187,7 @@ gv_init(struct g_class *mp) mtx_init(&sc->config_mtx, "gv_config", NULL, MTX_DEF); mtx_init(&sc->equeue_mtx, "gv_equeue", NULL, MTX_DEF); mtx_init(&sc->bqueue_mtx, "gv_bqueue", NULL, MTX_DEF); - kproc_create(gv_worker, sc, NULL, 0, 0, "gv_worker"); + kproc_create(gv_worker, sc, &sc->worker, 0, 0, "gv_worker"); } static int @@ -201,10 +201,9 @@ gv_unload(struct gctl_req *req, struct g sc = gp->softc; if (sc != NULL) { - gv_post_event(sc, GV_EVENT_THREAD_EXIT, NULL, NULL, 0, 0); + gv_worker_exit(sc); gp->softc = NULL; g_wither_geom(gp, ENXIO); - return (EAGAIN); } return (0); @@ -970,8 +969,8 @@ gv_worker(void *arg) g_free(sc->bqueue_down); g_free(sc->bqueue_up); g_free(sc); - kproc_exit(ENXIO); - break; /* not reached */ + kproc_exit(0); + /* NOTREACHED */ default: G_VINUM_DEBUG(1, "unknown event %d", ev->type); Modified: stable/8/sys/geom/vinum/geom_vinum.h ============================================================================== --- stable/8/sys/geom/vinum/geom_vinum.h Sun Aug 8 09:06:59 2010 (r211064) +++ stable/8/sys/geom/vinum/geom_vinum.h Sun Aug 8 09:12:30 2010 (r211065) @@ -122,6 +122,7 @@ int gv_detach_sd(struct gv_sd *, int) void gv_worker(void *); void gv_post_event(struct gv_softc *, int, void *, void *, intmax_t, intmax_t); +void gv_worker_exit(struct gv_softc *); struct gv_event *gv_get_event(struct gv_softc *); void gv_remove_event(struct gv_softc *, struct gv_event *); void gv_drive_tasted(struct gv_softc *, struct g_provider *); Modified: stable/8/sys/geom/vinum/geom_vinum_events.c ============================================================================== --- stable/8/sys/geom/vinum/geom_vinum_events.c Sun Aug 8 09:06:59 2010 (r211064) +++ stable/8/sys/geom/vinum/geom_vinum_events.c Sun Aug 8 09:12:30 2010 (r211065) @@ -58,6 +58,20 @@ gv_post_event(struct gv_softc *sc, int e mtx_unlock(&sc->equeue_mtx); } +void +gv_worker_exit(struct gv_softc *sc) +{ + struct gv_event *ev; + + ev = g_malloc(sizeof(*ev), M_WAITOK | M_ZERO); + ev->type = GV_EVENT_THREAD_EXIT; + + mtx_lock(&sc->equeue_mtx); + TAILQ_INSERT_TAIL(&sc->equeue, ev, events); + wakeup(sc); + msleep(sc->worker, &sc->equeue_mtx, PDROP, "gv_wor", 0); +} + struct gv_event * gv_get_event(struct gv_softc *sc) { Modified: stable/8/sys/geom/vinum/geom_vinum_var.h ============================================================================== --- stable/8/sys/geom/vinum/geom_vinum_var.h Sun Aug 8 09:06:59 2010 (r211064) +++ stable/8/sys/geom/vinum/geom_vinum_var.h Sun Aug 8 09:12:30 2010 (r211065) @@ -238,6 +238,7 @@ struct gv_softc { struct bio_queue_head *bqueue_up; /* BIO queue for completed requests. */ struct g_geom *geom; /* Pointer to our VINUM geom. */ + struct proc *worker; /* Worker process. */ }; #endif