ports/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Runtime-r0drv-freebsd-sleepqueue-r0drv-freebsd.h
Guido Falsi 42d8425b62 - Update VirtualBox OSE to 6.1.18
- Old VirtualBox OSE 5.2.44 preserved as "-legacy" versions of the
  ports (repocopied)
- Add back extra patch removed in r528258, actually required to
  build DEBUG kmod
- Correctly define WITH_DEBUG when enabling the DEBUG option, so
  binaries are not stripped

Please note that this new version supports only amd64 CPUs. If you need
to use older hardware please install the legacy ports.

Note that moving VM snapshots across major updates is unsupported, it's
strongly suggested to properly shutdown VMs before upgrading, please
check UPDATING for further details.

This update is the result of work from many people, and thanks to all
who gave feedback and tested things.

Patch based on work from: Mario Lobo <lobo@bsd.com.br> and jkim.

PR:			234878
Submitted by:		kunda <chitty_cloud@me.com>
Approved by:		vbox (implicit)
Reviewed by:		decke
Tested by:		jwb,
			martin ilavsky <ilavsky.martin@gmail.com>,
			Mario Lobo <lobo@bsd.com.br>
Relnotes:		https://www.virtualbox.org/wiki/Changelog-6.1
Differential Revision:	https://reviews.freebsd.org/D28871
2021-03-09 18:27:36 +00:00

20 lines
1,004 B
C

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 patch improves the situation significantly. Also, it (approximately) follows
what tvtohz does.
Submitted by: Andriy Gapon <avg@FreeBSD.org>
--- src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h.orig 2020-05-13 19:44:32 UTC
+++ src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h
@@ -82,6 +82,8 @@ DECLINLINE(uint32_t) rtR0SemBsdWaitUpdateTimeout(PRTR0
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