Date: Tue, 6 Jun 2006 03:09:09 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 98625 for review Message-ID: <200606060309.k563997P088525@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=98625 Change 98625 by jb@jb_freebsd2 on 2006/06/06 03:08:18 Add a function to get DTrace high resolution time independent of any other functions that can have DTrace probes enabled on them. DTrace high resolution time is equivalent to FreeBSD's nanouptime. Affected files ... .. //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/sys/dtrace.h#18 edit .. //depot/projects/dtrace/src/sys/kern/kern_tc.c#2 edit .. //depot/projects/dtrace/src/sys/sys/time.h#4 edit Differences ... ==== //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/sys/dtrace.h#18 (text) ==== @@ -2231,7 +2231,9 @@ extern void (*dtrace_debugger_fini)(void); extern dtrace_cacheid_t dtrace_predcache_id; +#if defined(sun) extern hrtime_t dtrace_gethrtime(void); +#endif extern void dtrace_sync(void); extern void dtrace_toxic_ranges(void (*)(uintptr_t, uintptr_t)); extern void dtrace_xcall(processorid_t, dtrace_xcall_t, void *); ==== //depot/projects/dtrace/src/sys/kern/kern_tc.c#2 (text+ko) ==== @@ -10,6 +10,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/sys/kern/kern_tc.c,v 1.175 2006/03/15 20:22:32 phk Exp $"); +#include "opt_kdtrace.h" #include "opt_ntp.h" #include <sys/param.h> @@ -303,6 +304,34 @@ } /* + * DTrace needs a high resolution time function which can + * be called from a probe context and guaranteed not to have + * instrumented with probes itself. It avoids instrumenting + * functions with the 'dtrace_' prefix. + * + * The 'high resolution' time is actually nanoseconds uptime. + */ +#ifdef KDTRACE +uint64_t +dtrace_gethrtime() +{ + struct timehands *th; + u_int gen; + uint64_t hrt; + + do { + th = timehands; + gen = th->th_generation; + + hrt = th->th_offset.sec * (uint64_t)1000000000 + + (((uint64_t)1000000000 * (uint32_t)(th->th_offset.frac >> 32)) >> 32); + } while (gen == 0 || gen != th->th_generation); + + return (hrt); +} +#endif + +/* * Initialize a new timecounter and possibly use it. */ void ==== //depot/projects/dtrace/src/sys/sys/time.h#4 (text+ko) ==== @@ -304,6 +304,7 @@ void timevaladd(struct timeval *t1, const struct timeval *t2); void timevalsub(struct timeval *t1, const struct timeval *t2); int tvtohz(struct timeval *tv); +uint64_t dtrace_gethrtime(void); #else /* !_KERNEL */ #include <time.h>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606060309.k563997P088525>