From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Roman Kagan <rkagan@virtuozzo.com>
Cc: "Stephen Hemminger" <sthemmin@microsoft.com>,
kvm@vger.kernel.org, "Radim Krčmář" <rkrcmar@redhat.com>,
"Haiyang Zhang" <haiyangz@microsoft.com>,
x86@kernel.org, linux-kernel@vger.kernel.org,
devel@linuxdriverproject.org,
"Michael Kelley (EOSG)" <Michael.H.Kelley@microsoft.com>,
"Ingo Molnar" <mingo@redhat.com>,
"Andy Lutomirski" <luto@kernel.org>,
"H. Peter Anvin" <hpa@zytor.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Mohammed Gamal" <mmorsy@redhat.com>
Subject: Re: [PATCH 6/6] x86/kvm: support Hyper-V reenlightenment
Date: Tue, 12 Dec 2017 09:17:37 +0100 [thread overview]
Message-ID: <87zi6o4axq.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <877ettk2mx.fsf@vitty.brq.redhat.com> (Vitaly Kuznetsov's message of "Mon, 11 Dec 2017 10:57:58 +0100")
Vitaly Kuznetsov <vkuznets@redhat.com> writes:
> Roman Kagan <rkagan@virtuozzo.com> writes:
>
>> On Fri, Dec 08, 2017 at 11:50:00AM +0100, Vitaly Kuznetsov wrote:
>>> When we run nested KVM on Hyper-V guests we need 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 our host (Hyper-V) to stop emulating TSC accesses.
>>> - Update our gtod copy, recompute clocks.
>>> - Unpause all guests.
>>>
>>> This is somewhat similar to cpufreq but we have two important differences:
>>> we can only disable TSC emulation globally (on all CPUs) and we don't know
>>> the new TSC frequency until we turn the emulation off so we can't
>>> 'prepare' ourselves to the event.
>>>
>>> Signed-off-by: Vitaly Kuznetsov <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 96e04a0cb921..04d90712ffd2 100644
>>> --- a/arch/x86/kvm/x86.c
>>> +++ b/arch/x86/kvm/x86.c
>>> @@ -68,6 +68,7 @@
>>> #include <asm/div64.h>
>>> #include <asm/irq_remapping.h>
>>> #include <asm/mshyperv.h>
>>> +#include <asm/hypervisor.h>
>>>
>>> #define CREATE_TRACE_POINTS
>>> #include "trace.h"
>>> @@ -5946,6 +5947,43 @@ static void tsc_khz_changed(void *data)
>>> __this_cpu_write(cpu_tsc_khz, khz);
>>> }
>>>
>>> +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);
>>
>> Can't you skip all this if the tsc frequency hasn't changed (which
>> should probably be the case when the CPU supports tsc frequency
>> scaling)?
>>
>
> The thing is that we don't know if it changed or not: only after
> disabling TSC emulation we'll be able to read the new one from the host
> and we need to do this with all VMs paused.
(having second thoughts here)
While we don't know if TSC frequency has changed or not, we can check
the emulation status before calling the callback and if TSC accesses are
not emulated omit the call. However, it seems that Hyper-V host (as of
WS2016) turns on emulation regardless of the TSC scaling presence.
I'll add emulation status check before issuing the callback in v2. The
change will go to PATCH3.
--
Vitaly
prev parent reply other threads:[~2017-12-12 8:17 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-08 10:49 [PATCH 0/6] x86/kvm/hyperv: stable clocksorce for L2 guests when running nested KVM on Hyper-V Vitaly Kuznetsov
2017-12-08 10:49 ` [PATCH 1/6] x86/hyper-v: check for required priviliges in hyperv_init() Vitaly Kuznetsov
2017-12-08 10:49 ` [PATCH 2/6] x86/hyper-v: add a function to read both TSC and TSC page value simulateneously Vitaly Kuznetsov
2017-12-08 10:49 ` [PATCH 3/6] x86/hyper-v: reenlightenment notifications support Vitaly Kuznetsov
2017-12-08 18:10 ` Roman Kagan
2017-12-11 9:56 ` Vitaly Kuznetsov
2017-12-11 17:10 ` Roman Kagan
2017-12-12 8:04 ` Vitaly Kuznetsov
2017-12-13 0:50 ` Michael Kelley (EOSG)
2017-12-13 10:03 ` Vitaly Kuznetsov
2017-12-08 10:49 ` [PATCH 4/6] x86/hyper-v: redirect reenlightment notifications on CPU offlining Vitaly Kuznetsov
2017-12-08 10:49 ` [PATCH 5/6] x86/kvm: pass stable clocksource to guests when running nested on Hyper-V Vitaly Kuznetsov
2017-12-08 10:50 ` [PATCH 6/6] x86/kvm: support Hyper-V reenlightenment Vitaly Kuznetsov
2017-12-08 17:39 ` Roman Kagan
2017-12-11 9:57 ` Vitaly Kuznetsov
2017-12-12 8:17 ` Vitaly Kuznetsov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zi6o4axq.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=Michael.H.Kelley@microsoft.com \
--cc=devel@linuxdriverproject.org \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=mmorsy@redhat.com \
--cc=pbonzini@redhat.com \
--cc=rkagan@virtuozzo.com \
--cc=rkrcmar@redhat.com \
--cc=sthemmin@microsoft.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox