Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Mar 2021 18:43:56 GMT
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: ec24f78e5b20 - stable/13 - x86: tsc: deprioritize TSC on VirtualBox
Message-ID:  <202103121843.12CIhuAf045747@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=ec24f78e5b201ea56a69607c6e4438a2faac25c0

commit ec24f78e5b201ea56a69607c6e4438a2faac25c0
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2021-03-08 20:20:10 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2021-03-12 18:43:43 +0000

    x86: tsc: deprioritize TSC on VirtualBox
    
    Misbehavior has been observed with TSC under VirtualBox, where threads
    doing small sleeps (~1 second) may miss their wake up and hang around
    in a sleep state indefinitely.  Switching back to ACPI-fast decidedly
    fixes it, so stop using TSC on VirtualBox at least for the time being.
    
    This partially reverts 84eaf2ccc6aa, applying it only to VirtualBox and
    increasing the quality to 0. Negative qualities can never be chosen and
    cannot be chosen with the tunable recently added. If we do not have a
    timecounter with a higher quality than 0, then TSC does at least leave
    the system mostly usable.
    
    PR:             253087
    
    (cherry picked from commit 8cc15b0dfc2f3299662e78f18bd6127f83c14ab4)
---
 sys/x86/x86/tsc.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c
index de0a1505c2f6..5ffbb64229e9 100644
--- a/sys/x86/x86/tsc.c
+++ b/sys/x86/x86/tsc.c
@@ -503,6 +503,14 @@ test_tsc(int adj_max_count)
 
 	if ((!smp_tsc && !tsc_is_invariant))
 		return (-100);
+	/*
+	 * Misbehavior of TSC under VirtualBox has been observed.  In
+	 * particular, threads doing small (~1 second) sleeps may miss their
+	 * wakeup and hang around in sleep state, causing hangs on shutdown.
+	 */
+	if (vm_guest == VM_GUEST_VBOX)
+		return (0);
+
 	size = (mp_maxid + 1) * 3;
 	data = malloc(sizeof(*data) * size * N, M_TEMP, M_WAITOK);
 	adj = 0;



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