mirror of
https://git.freebsd.org/ports.git
synced 2025-04-28 09:36:41 -04:00
After 1500021, kick_proc0() doesn't exist. PR: 280495 Approved by: vvd (maintainer) Reported by: Michael Butler <imb@protected-networks.net>
39 lines
1.5 KiB
C
39 lines
1.5 KiB
C
Without the first part of 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 clamping improves the situation significantly. Also, it (approximately)
|
|
follows what tvtohz does. The rest of the patch just chases an upstream
|
|
KPI change.
|
|
|
|
Submitted by: Andriy Gapon <avg@FreeBSD.org>
|
|
--- src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h.orig 2024-07-29 13:10:32 UTC
|
|
+++ src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h
|
|
@@ -84,6 +84,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
|
|
@@ -300,10 +302,16 @@ DECLINLINE(void) rtR0SemBsdSignal(void *pvWaitChan)
|
|
DECLINLINE(void) rtR0SemBsdSignal(void *pvWaitChan)
|
|
{
|
|
sleepq_lock(pvWaitChan);
|
|
+#if __FreeBSD_version < 1500022
|
|
int fWakeupSwapProc = sleepq_signal(pvWaitChan, SLEEPQ_CONDVAR, 0, 0);
|
|
+#else
|
|
+ sleepq_signal(pvWaitChan, SLEEPQ_CONDVAR, 0, 0);
|
|
+#endif
|
|
sleepq_release(pvWaitChan);
|
|
+#if __FreeBSD_version < 1500022
|
|
if (fWakeupSwapProc)
|
|
kick_proc0();
|
|
+#endif
|
|
}
|
|
|
|
/**
|