From owner-svn-src-projects@FreeBSD.ORG Thu Oct 10 20:03:55 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 38FDD82B; Thu, 10 Oct 2013 20:03:55 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0CB1E28E7; Thu, 10 Oct 2013 20:03:55 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r9AK3si6038369; Thu, 10 Oct 2013 20:03:54 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r9AK3smQ038364; Thu, 10 Oct 2013 20:03:54 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201310102003.r9AK3smQ038364@svn.freebsd.org> From: Alexander Motin Date: Thu, 10 Oct 2013 20:03:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256295 - in projects/camlock/sys: geom kern X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Oct 2013 20:03:55 -0000 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); }