Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Aug 2013 15:34:18 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r254912 - projects/camlock/sys/geom/nop
Message-ID:  <201308261534.r7QFYJAT045321@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Aug 26 15:34:18 2013
New Revision: 254912
URL: http://svnweb.freebsd.org/changeset/base/254912

Log:
  Make GEOM NOP support direct dispatch by locking statistics update.

Modified:
  projects/camlock/sys/geom/nop/g_nop.c
  projects/camlock/sys/geom/nop/g_nop.h

Modified: projects/camlock/sys/geom/nop/g_nop.c
==============================================================================
--- projects/camlock/sys/geom/nop/g_nop.c	Mon Aug 26 14:14:25 2013	(r254911)
+++ projects/camlock/sys/geom/nop/g_nop.c	Mon Aug 26 15:34:18 2013	(r254912)
@@ -107,6 +107,7 @@ g_nop_start(struct bio *bp)
 	gp = bp->bio_to->geom;
 	sc = gp->softc;
 	G_NOP_LOGREQ(bp, "Request received.");
+	mtx_lock(&sc->sc_lock);
 	switch (bp->bio_cmd) {
 	case BIO_READ:
 		sc->sc_reads++;
@@ -119,6 +120,7 @@ g_nop_start(struct bio *bp)
 		failprob = sc->sc_wfailprob;
 		break;
 	}
+	mtx_unlock(&sc->sc_lock);
 	if (failprob > 0) {
 		u_int rval;
 
@@ -224,6 +226,7 @@ g_nop_create(struct gctl_req *req, struc
 	sc->sc_writes = 0;
 	sc->sc_readbytes = 0;
 	sc->sc_wrotebytes = 0;
+	mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF);
 	gp->softc = sc;
 	gp->start = g_nop_start;
 	gp->orphan = g_nop_orphan;
@@ -232,10 +235,12 @@ g_nop_create(struct gctl_req *req, struc
 	gp->dumpconf = g_nop_dumpconf;
 
 	newpp = g_new_providerf(gp, "%s", gp->name);
+	newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE;
 	newpp->mediasize = size;
 	newpp->sectorsize = secsize;
 
 	cp = g_new_consumer(gp);
+	cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
 	error = g_attach(cp, pp);
 	if (error != 0) {
 		gctl_error(req, "Cannot attach to provider %s.", pp->name);
@@ -251,6 +256,7 @@ fail:
 		g_detach(cp);
 	g_destroy_consumer(cp);
 	g_destroy_provider(newpp);
+	mtx_destroy(&sc->sc_lock);
 	g_free(gp->softc);
 	g_destroy_geom(gp);
 	return (error);
@@ -259,10 +265,12 @@ fail:
 static int
 g_nop_destroy(struct g_geom *gp, boolean_t force)
 {
+	struct g_nop_softc *sc;
 	struct g_provider *pp;
 
 	g_topology_assert();
-	if (gp->softc == NULL)
+	sc = gp->softc;
+	if (sc == NULL)
 		return (ENXIO);
 	pp = LIST_FIRST(&gp->provider);
 	if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) {
@@ -277,8 +285,9 @@ g_nop_destroy(struct g_geom *gp, boolean
 	} else {
 		G_NOP_DEBUG(0, "Device %s removed.", gp->name);
 	}
-	g_free(gp->softc);
 	gp->softc = NULL;
+	mtx_destroy(&sc->sc_lock);
+	g_free(sc);
 	g_wither_geom(gp, ENXIO);
 
 	return (0);

Modified: projects/camlock/sys/geom/nop/g_nop.h
==============================================================================
--- projects/camlock/sys/geom/nop/g_nop.h	Mon Aug 26 14:14:25 2013	(r254911)
+++ projects/camlock/sys/geom/nop/g_nop.h	Mon Aug 26 15:34:18 2013	(r254912)
@@ -65,6 +65,7 @@ struct g_nop_softc {
 	uintmax_t	sc_writes;
 	uintmax_t	sc_readbytes;
 	uintmax_t	sc_wrotebytes;
+	struct mtx	sc_lock;
 };
 #endif	/* _KERNEL */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308261534.r7QFYJAT045321>