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>