Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Dec 2012 15:08:57 +0200
From:      Andriy Gapon <avg@FreeBSD.org>
To:        vbox@FreeBSD.org, freebsd-emulation@FreeBSD.org
Subject:   incorrect usage of callout_reset in vbox 4.2.4 ?
Message-ID:  <50C9D369.6040204@FreeBSD.org>

next in thread | raw e-mail | index | archive | help

It looks like in timer-r0drv-freebsd.c the code tries to pass absolute time as a
timeout parameter to callout_reset while that function actually expects relative
time (period).

I am testing the following patch, but I am sure that the code can be made more
efficient.

--- timer-r0drv-freebsd.c.orig	2012-12-12 20:13:27.623202784 +0200
+++ timer-r0drv-freebsd.c	2012-12-12 20:19:43.368202795 +0200
@@ -172,15 +172,16 @@
     /*
      * Calc when it should start firing.
      */
-    u64First += RTTimeNanoTS();
+    const uint64_t u64Now = RTTimeNanoTS();
+    u64First += u64Now;

     pTimer->fSuspended = false;
     pTimer->iTick = 0;
     pTimer->u64StartTS = u64First;
     pTimer->u64NextTS = u64First;

-    tv.tv_sec  =  u64First / 1000000000;
-    tv.tv_usec = (u64First % 1000000000) / 1000;
+    tv.tv_sec  =  (u64First - u64Now) / 1000000000;
+    tv.tv_usec = ((u64First - u64Now) % 1000000000) / 1000;
     callout_reset(&pTimer->Callout, tvtohz(&tv), rtTimerFreeBSDCallback, pTimer);

     return VINF_SUCCESS;
@@ -247,8 +248,8 @@
         if (pTimer->u64NextTS < u64NanoTS)
             pTimer->u64NextTS = u64NanoTS + RTTimerGetSystemGranularity() / 2;

-        tv.tv_sec = pTimer->u64NextTS / 1000000000;
-        tv.tv_usec = (pTimer->u64NextTS % 1000000000) / 1000;
+        tv.tv_sec = (pTimer->u64NextTS - u64NanoTS) / 1000000000;
+        tv.tv_usec = ((pTimer->u64NextTS - u64NanoTS) % 1000000000) / 1000;
         callout_reset(&pTimer->Callout, tvtohz(&tv), rtTimerFreeBSDCallback, pTimer);
     }



-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50C9D369.6040204>