Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Oct 2013 20:03:54 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r256295 - in projects/camlock/sys: geom kern
Message-ID:  <201310102003.r9AK3smQ038364@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Oct 10 20:03:54 2013
New Revision: 256295
URL: http://svnweb.freebsd.org/changeset/base/256295

Log:
  Use the same satistics for disk and its GEOM provider.
  
  Avoiding double accounting allows to reduce CPU load on I/O, especially on
  machines with slow timecounter.  As side effect it also makes gstat show
  statistics for raw disk providers even when kern.geom.collectstats is set
  to zero, making that mode more usable.

Modified:
  projects/camlock/sys/geom/geom_disk.c
  projects/camlock/sys/geom/geom_io.c
  projects/camlock/sys/kern/subr_devstat.c

Modified: projects/camlock/sys/geom/geom_disk.c
==============================================================================
--- projects/camlock/sys/geom/geom_disk.c	Thu Oct 10 19:56:31 2013	(r256294)
+++ projects/camlock/sys/geom/geom_disk.c	Thu Oct 10 20:03:54 2013	(r256295)
@@ -554,6 +554,9 @@ g_disk_create(void *arg, int flag)
 	gp = g_new_geomf(&g_disk_class, "%s%d", dp->d_name, dp->d_unit);
 	gp->softc = sc;
 	pp = g_new_providerf(gp, "%s", gp->name);
+	devstat_remove_entry(pp->stat);
+	pp->stat = NULL;
+	dp->d_devstat->id = pp;
 	pp->mediasize = dp->d_mediasize;
 	pp->sectorsize = dp->d_sectorsize;
 	pp->stripeoffset = dp->d_stripeoffset;

Modified: projects/camlock/sys/geom/geom_io.c
==============================================================================
--- projects/camlock/sys/geom/geom_io.c	Thu Oct 10 19:56:31 2013	(r256294)
+++ projects/camlock/sys/geom/geom_io.c	Thu Oct 10 20:03:54 2013	(r256295)
@@ -510,7 +510,7 @@ g_io_request(struct bio *bp, struct g_co
 
 	KASSERT(!(bp->bio_flags & BIO_ONQUEUE),
 	    ("Bio already on queue bp=%p", bp));
-	if (g_collectstats)
+	if ((g_collectstats & ~(pp->stat ? 0 : 1)) != 0)
 		binuptime(&bp->bio_t0);
 	else
 		getbinuptime(&bp->bio_t0);
@@ -647,7 +647,7 @@ g_io_deliver(struct bio *bp, int error)
 	 * can not update one instance of the statistics from more
 	 * than one thread at a time, so grab the lock first.
 	 */
-	if (g_collectstats)
+	if ((g_collectstats & ~(pp->stat ? 0 : 1)) != 0)
 		binuptime(&now);
 	mtxp = mtx_pool_find(mtxpool_sleep, cp);
 	mtx_lock(mtxp);

Modified: projects/camlock/sys/kern/subr_devstat.c
==============================================================================
--- projects/camlock/sys/kern/subr_devstat.c	Thu Oct 10 19:56:31 2013	(r256294)
+++ projects/camlock/sys/kern/subr_devstat.c	Thu Oct 10 20:03:54 2013	(r256295)
@@ -131,6 +131,7 @@ devstat_new_entry(const void *dev_name,
 	ds = devstat_alloc();
 	mtx_lock(&devstat_mutex);
 	if (unit_number == -1) {
+		ds->unit_number = unit_number;
 		ds->id = dev_name;
 		binuptime(&ds->creation_time);
 		devstat_generation++;
@@ -242,7 +243,7 @@ devstat_remove_entry(struct devstat *ds)
 
 	/* Remove this entry from the devstat queue */
 	atomic_add_acq_int(&ds->sequence1, 1);
-	if (ds->id == NULL) {
+	if (ds->unit_number != -1) {
 		devstat_num_devs--;
 		STAILQ_REMOVE(devstat_head, ds, devstat, dev_links);
 	}



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