Author: avg
Date: Sat Jun  4 07:02:06 2011
New Revision: 222670
URL: http://svn.freebsd.org/changeset/base/222670

Log:
  opensolaris compat / zfs: avoid early overflow in ddi_get_lbolt*
  
  Reported by:  David P. Discher <d...@bitgravity.com>
  Tested by:    will
  Reviewed by:  art
  Discussed with:       dwhite
  MFC after:    2 weeks

Modified:
  head/sys/cddl/compat/opensolaris/kern/opensolaris.c
  head/sys/cddl/compat/opensolaris/sys/time.h

Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris.c
==============================================================================
--- head/sys/cddl/compat/opensolaris/kern/opensolaris.c Sat Jun  4 04:35:12 
2011        (r222669)
+++ head/sys/cddl/compat/opensolaris/kern/opensolaris.c Sat Jun  4 07:02:06 
2011        (r222670)
@@ -40,6 +40,7 @@
 cpu_core_t     cpu_core[MAXCPU];
 kmutex_t       cpu_lock;
 solaris_cpu_t  solaris_cpu[MAXCPU];
+int            nsec_per_tick;
 
 /*
  *  OpenSolaris subsystem initialisation.
@@ -60,6 +61,8 @@ opensolaris_load(void *dummy)
        }
 
        mutex_init(&cpu_lock, "OpenSolaris CPU lock", MUTEX_DEFAULT, NULL);
+
+       nsec_per_tick = NANOSEC / hz;
 }
 
 SYSINIT(opensolaris_register, SI_SUB_OPENSOLARIS, SI_ORDER_FIRST, 
opensolaris_load, NULL);

Modified: head/sys/cddl/compat/opensolaris/sys/time.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/time.h Sat Jun  4 04:35:12 2011        
(r222669)
+++ head/sys/cddl/compat/opensolaris/sys/time.h Sat Jun  4 07:02:06 2011        
(r222670)
@@ -62,8 +62,21 @@ gethrtime(void) {
 #define        gethrestime(ts)         getnanotime(ts)
 #define        gethrtime_waitfree()    gethrtime()
 
-#define        ddi_get_lbolt()         ((gethrtime() * hz) / NANOSEC)
-#define        ddi_get_lbolt64()       (int64_t)((gethrtime() * hz) / NANOSEC)
+extern int nsec_per_tick;      /* nanoseconds per clock tick */
+
+static __inline int64_t
+ddi_get_lbolt64(void)
+{
+
+       return (gethrtime() / nsec_per_tick);
+}
+
+static __inline clock_t
+ddi_get_lbolt(void)
+{
+
+       return (ddi_get_lbolt64());
+}
 
 #else
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to