From mboxrd@z Thu Jan 1 00:00:00 1970 From: Radim =?utf-8?B?S3LEjW3DocWZ?= Subject: Re: [PATCH] x86/kvm: fix condition to update kvm master clocks Date: Thu, 26 May 2016 22:19:36 +0200 Message-ID: <20160526201936.GA25334@potion> References: <1464274195-31296-1-git-send-email-rkagan@virtuozzo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org, "Denis V. Lunev" , Owen Hofmann , Paolo Bonzini , Marcelo Tosatti To: Roman Kagan Return-path: Received: from mx1.redhat.com ([209.132.183.28]:48509 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754871AbcEZUTk (ORCPT ); Thu, 26 May 2016 16:19:40 -0400 Content-Disposition: inline In-Reply-To: <1464274195-31296-1-git-send-email-rkagan@virtuozzo.com> Sender: kvm-owner@vger.kernel.org List-ID: 2016-05-26 17:49+0300, Roman Kagan: > The condition to schedule per-VM master clock updates is inversed; as a > result the master clocks are never updated and the kvm_clock drift WRT > host's NTP-disciplined clock (which was the motivation to introduce this > machinery in the first place) still remains. > > Fix it, and reword the comment to make it more apparent what the desired > behavior is. > > Cc: Owen Hofmann > Cc: Paolo Bonzini > Cc: Marcelo Tosatti > Signed-off-by: Roman Kagan > --- > arch/x86/kvm/x86.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index c805cf4..d8f591c 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -5810,10 +5810,10 @@ static int pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused, > > update_pvclock_gtod(tk); > > - /* disable master clock if host does not trust, or does not > - * use, TSC clocksource > + /* only schedule per-VM master clock updates if the host uses TSC and > + * there's at least one VM in need of an update > */ > - if (gtod->clock.vclock_mode != VCLOCK_TSC && > + if (gtod->clock.vclock_mode == VCLOCK_TSC && I think we still want to disable master clock when vclock_mode is not VCLOCK_TSC. > atomic_read(&kvm_guest_has_master_clock) != 0) And I don't see why we don't want to enable master clock if the host switches back to TSC. > queue_work(system_long_wq, &pvclock_gtod_work); Queueing unconditionally seems to be the correct thing to do. Interaction between kvm_gen_update_masterclock(), pvclock_gtod_work(), and NTP could be a problem: kvm_gen_update_masterclock() only has to run once per VM, but pvclock_gtod_work() calls it on every VCPU, so frequent NTP updates on bigger guests could kill performance. (Maybe kvm_gen_update_masterclock() is too wasteful even when called once.)