Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Dec 2012 15:05:00 +0200
From:      Andriy Gapon <avg@FreeBSD.org>
To:        vbox@FreeBSD.org, freebsd-emulation@FreeBSD.org
Subject:   issue with under-tick waits
Message-ID:  <50C9D27C.1090707@FreeBSD.org>

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

I think that the following patch is needed in VirtualBox 4.2.4 kernel module:

--- sleepqueue-r0drv-freebsd.h.orig	2012-12-12 20:09:29.675203802 +0200
+++ sleepqueue-r0drv-freebsd.h	2012-12-12 20:11:53.604203131 +0200
@@ -82,6 +82,8 @@
     uint64_t cTicks = ASMMultU64ByU32DivByU32(uTimeout, hz, UINT32_C(1000000000));
     if (cTicks >= INT_MAX)
         return RTSEMWAIT_FLAGS_INDEFINITE;
+    else if (cTicks == 0 && uTimeout > 0)
+        pWait->iTimeout     = 1;
     else
         pWait->iTimeout     = (int)cTicks;
 #endif

Without this patch any waits for periods shorter than a single tick return
immediately leading to a lot of unnecessary spinning.  For example, I observe that
my guest's idle loop does a lot of sleeps with periods slightly shorter than 1 ms
(1/hz), e.g. 900us.  All that waiting turns into pure spinning and VirtualBox eats
100% of a core.
The above patch improves the situation significantly.  Also, it (approximately)
follows what tvtohz does.

-- 
Andriy Gapon



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