From nobody Tue Feb 10 13:16:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1592996436; cv=none; d=zohomail.com; s=zohoarc; b=kd0t9/tVNGK5S6dRMpBCf2sQD5kKz8tLRbQ4orUbBTFY6OgVN4AaqUbKa6UKMEnpaHEKLNbt2Nvo0sTd3L1xxVrcrv9TeCbyJFLo2g6Or/uW24dHP5eV/aNltfLQEIdt0dThLYc27EsHdDc5O8HiXhBJqpfAkW8eg0/4MUYfBmw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1592996436; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=G0fxQjUvS31mvtxaUp0D7yZJbxAdTCXA9Iw4PMRAuPo=; b=N2updQOJna7yL3G4MtZhhdProqCbppG59yQAb2O97Lxpcj/8QWv8mGtrEfrQn7DCbXNVi+YuQz3T8wBygDQMUn4Cf/mbgcNGaiE62MH0thrGt/dqs6BBs2oQ9keAf6OU1cgC6ZLk9KdwHg9FXf94IC/dKUKOSkLfb5idCFuGJKo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1592996436249583.8747841405324; Wed, 24 Jun 2020 04:00:36 -0700 (PDT) Received: from localhost ([::1]:60230 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jo38r-0002X9-Eq for importer@patchew.org; Wed, 24 Jun 2020 07:00:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56796) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jo2zz-0001Z1-MX for qemu-devel@nongnu.org; Wed, 24 Jun 2020 06:51:23 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:51762 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jo2zx-0001QC-2V for qemu-devel@nongnu.org; Wed, 24 Jun 2020 06:51:23 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-248-2g3qXzjPNLOJkyqw0rn3lQ-1; Wed, 24 Jun 2020 06:51:18 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D8434107ACCA for ; Wed, 24 Jun 2020 10:51:17 +0000 (UTC) Received: from virtlab511.virt.lab.eng.bos.redhat.com (virtlab511.virt.lab.eng.bos.redhat.com [10.19.152.198]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6B28961981; Wed, 24 Jun 2020 10:51:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1592995880; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G0fxQjUvS31mvtxaUp0D7yZJbxAdTCXA9Iw4PMRAuPo=; b=EDnl2vMVCKyfVf/U++8kVfilQRlao1fGTiP001k+fC7umQxqfDOSwZxM6aP8OtvGB1TBzL hvxc3j54ez1jFGU67vfwe5qfKyVgRI7FFzsgzUq67IplUVfa4VC1yB0meRXch7q0eBhgSK 0azxGTqoyJT5iIhOReaVhYsEjLs4CK8= X-MC-Unique: 2g3qXzjPNLOJkyqw0rn3lQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PULL 27/31] kvm: i386: allow TSC to differ by NTP correction bounds without TSC scaling Date: Wed, 24 Jun 2020 06:50:44 -0400 Message-Id: <20200624105048.375353-27-pbonzini@redhat.com> In-Reply-To: <20200624104917.375143-1-pbonzini@redhat.com> References: <20200624104917.375143-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.120; envelope-from=pbonzini@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/24 03:27:53 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcelo Tosatti Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Marcelo Tosatti The Linux TSC calibration procedure is subject to small variations (its common to see +-1 kHz difference between reboots on a given CPU, for e= xample). So migrating a guest between two hosts with identical processor can fail, i= n case of a small variation in calibrated TSC between them. Allow a conservative 250ppm error between host TSC and VM TSC frequencies, rather than requiring an exact match. NTP daemon in the guest can correct this difference. Also change migration to accept this bound. KVM_SET_TSC_KHZ depends on a kernel interface change. Without this change, the behaviour remains the same: in case of a different frequency between host and VM, KVM_SET_TSC_KHZ will fail and QEMU will exit. Signed-off-by: Marcelo Tosatti Message-Id: <20200616165805.GA324612@fuller.cnet> Signed-off-by: Paolo Bonzini --- target/i386/kvm.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index b3c13cb898..6adbff3d74 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -740,26 +740,62 @@ static bool hyperv_enabled(X86CPU *cpu) cpu->hyperv_features || cpu->hyperv_passthrough); } =20 +/* + * Check whether target_freq is within conservative + * ntp correctable bounds (250ppm) of freq + */ +static inline bool freq_within_bounds(int freq, int target_freq) +{ + int max_freq =3D freq + (freq * 250 / 1000000); + int min_freq =3D freq - (freq * 250 / 1000000); + + if (target_freq >=3D min_freq && target_freq <=3D max_freq) { + return true; + } + + return false; +} + static int kvm_arch_set_tsc_khz(CPUState *cs) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; - int r; + int r, cur_freq; + bool set_ioctl =3D false; =20 if (!env->tsc_khz) { return 0; } =20 - r =3D kvm_check_extension(cs->kvm_state, KVM_CAP_TSC_CONTROL) ? + cur_freq =3D kvm_check_extension(cs->kvm_state, KVM_CAP_GET_TSC_KHZ) ? + kvm_vcpu_ioctl(cs, KVM_GET_TSC_KHZ) : -ENOTSUP; + + /* + * If TSC scaling is supported, attempt to set TSC frequency. + */ + if (kvm_check_extension(cs->kvm_state, KVM_CAP_TSC_CONTROL)) { + set_ioctl =3D true; + } + + /* + * If desired TSC frequency is within bounds of NTP correction, + * attempt to set TSC frequency. + */ + if (cur_freq !=3D -ENOTSUP && freq_within_bounds(cur_freq, env->tsc_kh= z)) { + set_ioctl =3D true; + } + + r =3D set_ioctl ? kvm_vcpu_ioctl(cs, KVM_SET_TSC_KHZ, env->tsc_khz) : -ENOTSUP; + if (r < 0) { /* When KVM_SET_TSC_KHZ fails, it's an error only if the current * TSC frequency doesn't match the one we want. */ - int cur_freq =3D kvm_check_extension(cs->kvm_state, KVM_CAP_GET_TS= C_KHZ) ? - kvm_vcpu_ioctl(cs, KVM_GET_TSC_KHZ) : - -ENOTSUP; + cur_freq =3D kvm_check_extension(cs->kvm_state, KVM_CAP_GET_TSC_KH= Z) ? + kvm_vcpu_ioctl(cs, KVM_GET_TSC_KHZ) : + -ENOTSUP; if (cur_freq <=3D 0 || cur_freq !=3D env->tsc_khz) { warn_report("TSC frequency mismatch between " "VM (%" PRId64 " kHz) and host (%d kHz), " --=20 2.26.2