Date: Mon, 7 Jan 2013 04:51:44 +0000 (UTC) From: Peter Grehan <grehan@svn.freebsd.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r245123 - projects/bhyve/usr.sbin/bhyve Message-ID: <50ea5460.1b8e.75385f2d@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: grehan Date: Mon Jan 7 04:51:43 2013 New Revision: 245123 URL: http://svnweb.freebsd.org/changeset/base/245123 Log: Use 64-bit arithmetic throughout, and lock accesses to globals. With this change, dbench with >= 4 processes runs without getting weird jumps forward in time when the APCI pmtimer is the default timecounter. Obtained from: NetApp Modified: projects/bhyve/usr.sbin/bhyve/pmtmr.c Modified: projects/bhyve/usr.sbin/bhyve/pmtmr.c ============================================================================== --- projects/bhyve/usr.sbin/bhyve/pmtmr.c Mon Jan 7 03:47:59 2013 (r245122) +++ projects/bhyve/usr.sbin/bhyve/pmtmr.c Mon Jan 7 04:51:43 2013 (r245123) @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include <stdio.h> #include <time.h> #include <assert.h> +#include <pthread.h> #include "inout.h" @@ -51,36 +52,42 @@ __FBSDID("$FreeBSD$"); #define PMTMR_FREQ 3579545 /* 3.579545MHz */ -static uint32_t pmtmr_tscf; -static uint32_t pmtmr_old; +static pthread_mutex_t pmtmr_mtx; +static uint64_t pmtmr_tscf; +static uint64_t pmtmr_old; static uint64_t pmtmr_tsc_old; static uint32_t pmtmr_val(void) { uint64_t pmtmr_tsc_new; - uint32_t pmtmr_new; + uint64_t pmtmr_new; static int inited = 0; if (!inited) { size_t len; + uint32_t tmpf; inited = 1; - len = sizeof(pmtmr_tscf); - sysctlbyname("machdep.tsc_freq", &pmtmr_tscf, &len, + pthread_mutex_init(&pmtmr_mtx, NULL); + len = sizeof(tmpf); + sysctlbyname("machdep.tsc_freq", &tmpf, &len, NULL, 0); + pmtmr_tscf = tmpf; pmtmr_tsc_old = rdtsc(); pmtmr_old = pmtmr_tsc_old / pmtmr_tscf * PMTMR_FREQ; return (pmtmr_old); } + pthread_mutex_lock(&pmtmr_mtx); pmtmr_tsc_new = rdtsc(); pmtmr_new = (pmtmr_tsc_new - pmtmr_tsc_old) * PMTMR_FREQ / pmtmr_tscf + pmtmr_old; pmtmr_old = pmtmr_new; pmtmr_tsc_old = pmtmr_tsc_new; + pthread_mutex_unlock(&pmtmr_mtx); - return (pmtmr_old); + return (pmtmr_new); } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50ea5460.1b8e.75385f2d>