Received: by 10.223.176.5 with SMTP id f5csp498447wra; Tue, 30 Jan 2018 15:06:06 -0800 (PST) X-Google-Smtp-Source: AH8x227rd58vG7TJ0Vf/cqC1I4tSxDANEdFAJOxtBDL8+nkTrTrQ1lGZblUY4DFCbaVWVnA12qgM X-Received: by 10.98.162.10 with SMTP id m10mr31547743pff.168.1517353566118; Tue, 30 Jan 2018 15:06:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517353566; cv=none; d=google.com; s=arc-20160816; b=Ll5+QCegnAkbWzf/qXzpOr6mGSzaJoQTYO7XCJcARyrKx6kkOpUrs3aNGnrhatXhff Q5GIJOEoH4ZEJSWj5xMN6gY4rYbZuJeX0ZEEljS9QofjJb2xdztJdrZXa9MtHJkF0Oay Zo5KUA5CPAeTxFLcCrTGRUV5aTIXyLddFPJl9QTrmJ2/WyDWWakhcy7qYl7/drCwRbKr JZmgQ2BP9BKIIhbbp9h7fIAkXbKVmNZW/xVCuWVdXtHNfLwrD6Am7L3QkeI6ePEn8rfE KtDd1uf2zO+1FzCJ6lNCO16k3fwpkfl1ZLpwQfTYD36o48zzRpOIEj8kZxMCO3EtwBlX g7NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date:arc-authentication-results; bh=CXsH58MooRHM9+rkw/KABFR9yMxFgfafW82A0JvA/Ig=; b=tGAP9tXdmtZrw6/o3wMAsx4FYhbmuK+Ps1owtWUuQQ4NK0mw/Xeo/UTpOEwNRUoNic JPMZ6Er4weXPEsvwnYBm6XJtF6D2w/5HhqCNJTJYfxHZYuEDNVc8ZPlYAQLuYjWdEx1z Ej6XQo2bZg0kfwqlyODHfw+pzAtreE2Y0X/xa+Ta/vYBfTlBTm4Ddtb4p29grsMqr210 rQX8MJ9txv5HhSlrjCM2Rri60TtFDMfwwRhPE1WQzQK0qGdVulK6JXGhEtEXJI4yMS53 ZnSY4KPI2ICBVznmIFsndUsvEQi7wDZ3hkNM676hkBQwjdEc8kE61vJYDGwwX6r5gH7f dLiw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u23si713070pgv.642.2018.01.30.15.05.51; Tue, 30 Jan 2018 15:06:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932097AbeA3XE2 (ORCPT + 99 others); Tue, 30 Jan 2018 18:04:28 -0500 Received: from terminus.zytor.com ([65.50.211.136]:54713 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753615AbeA3XE1 (ORCPT ); Tue, 30 Jan 2018 18:04:27 -0500 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTP id w0UN3HWt012133; Tue, 30 Jan 2018 15:03:17 -0800 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id w0UN3HSa012130; Tue, 30 Jan 2018 15:03:17 -0800 Date: Tue, 30 Jan 2018 15:03:17 -0800 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: tip-bot for Vitaly Kuznetsov Message-ID: Cc: vkuznets@redhat.com, linux-kernel@vger.kernel.org, sthemmin@microsoft.com, mmorsy@redhat.com, kys@microsoft.com, tglx@linutronix.de, pbonzini@redhat.com, hpa@zytor.com, rkrcmar@redhat.com, Michael.H.Kelley@microsoft.com, rkagan@virtuozzo.com, haiyangz@microsoft.com, mingo@kernel.org, cavery@redhat.com, luto@kernel.org Reply-To: vkuznets@redhat.com, sthemmin@microsoft.com, linux-kernel@vger.kernel.org, mmorsy@redhat.com, kys@microsoft.com, pbonzini@redhat.com, hpa@zytor.com, tglx@linutronix.de, rkrcmar@redhat.com, Michael.H.Kelley@microsoft.com, rkagan@virtuozzo.com, haiyangz@microsoft.com, mingo@kernel.org, cavery@redhat.com, luto@kernel.org In-Reply-To: <20180124132337.30138-8-vkuznets@redhat.com> References: <20180124132337.30138-8-vkuznets@redhat.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/hyperv] x86/kvm: Support Hyper-V reenlightenment Git-Commit-ID: 0092e4346f49558e5fe5a927c6d78d401dc4ed73 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 0092e4346f49558e5fe5a927c6d78d401dc4ed73 Gitweb: https://git.kernel.org/tip/0092e4346f49558e5fe5a927c6d78d401dc4ed73 Author: Vitaly Kuznetsov AuthorDate: Wed, 24 Jan 2018 14:23:37 +0100 Committer: Thomas Gleixner CommitDate: Tue, 30 Jan 2018 23:55:34 +0100 x86/kvm: Support Hyper-V reenlightenment When running nested KVM on Hyper-V guests its required to update masterclocks for all guests when L1 migrates to a host with different TSC frequency. Implement the procedure in the following way: - Pause all guests. - Tell the host (Hyper-V) to stop emulating TSC accesses. - Update the gtod copy, recompute clocks. - Unpause all guests. This is somewhat similar to cpufreq but there are two important differences: - TSC emulation can only be disabled globally (on all CPUs) - The new TSC frequency is not known until emulation is turned off so there is no way to 'prepare' for the event upfront. Signed-off-by: Vitaly Kuznetsov Signed-off-by: Thomas Gleixner Acked-by: Paolo Bonzini Cc: Stephen Hemminger Cc: kvm@vger.kernel.org Cc: Radim Krčmář Cc: Haiyang Zhang Cc: "Michael Kelley (EOSG)" Cc: Roman Kagan Cc: Andy Lutomirski Cc: devel@linuxdriverproject.org Cc: "K. Y. Srinivasan" Cc: Cathy Avery Cc: Mohammed Gamal Link: https://lkml.kernel.org/r/20180124132337.30138-8-vkuznets@redhat.com --- arch/x86/kvm/x86.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b1ce368..879a999 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -68,6 +68,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include "trace.h" @@ -5932,6 +5933,43 @@ static void tsc_khz_changed(void *data) __this_cpu_write(cpu_tsc_khz, khz); } +static void kvm_hyperv_tsc_notifier(void) +{ +#ifdef CONFIG_X86_64 + struct kvm *kvm; + struct kvm_vcpu *vcpu; + int cpu; + + spin_lock(&kvm_lock); + list_for_each_entry(kvm, &vm_list, vm_list) + kvm_make_mclock_inprogress_request(kvm); + + hyperv_stop_tsc_emulation(); + + /* TSC frequency always matches when on Hyper-V */ + for_each_present_cpu(cpu) + per_cpu(cpu_tsc_khz, cpu) = tsc_khz; + kvm_max_guest_tsc_khz = tsc_khz; + + list_for_each_entry(kvm, &vm_list, vm_list) { + struct kvm_arch *ka = &kvm->arch; + + spin_lock(&ka->pvclock_gtod_sync_lock); + + pvclock_update_vm_gtod_copy(kvm); + + kvm_for_each_vcpu(cpu, vcpu, kvm) + kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); + + kvm_for_each_vcpu(cpu, vcpu, kvm) + kvm_clear_request(KVM_REQ_MCLOCK_INPROGRESS, vcpu); + + spin_unlock(&ka->pvclock_gtod_sync_lock); + } + spin_unlock(&kvm_lock); +#endif +} + static int kvmclock_cpufreq_notifier(struct notifier_block *nb, unsigned long val, void *data) { @@ -6217,6 +6255,9 @@ int kvm_arch_init(void *opaque) kvm_lapic_init(); #ifdef CONFIG_X86_64 pvclock_gtod_register_notifier(&pvclock_gtod_notifier); + + if (x86_hyper_type == X86_HYPER_MS_HYPERV) + set_hv_tscchange_cb(kvm_hyperv_tsc_notifier); #endif return 0; @@ -6229,6 +6270,10 @@ out: void kvm_arch_exit(void) { +#ifdef CONFIG_X86_64 + if (x86_hyper_type == X86_HYPER_MS_HYPERV) + clear_hv_tscchange_cb(); +#endif kvm_lapic_exit(); perf_unregister_guest_info_callbacks(&kvm_guest_cbs);