From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH v3 5/6] pvclock: add clocksource change notification on changing of tsc stable bit Date: Mon, 31 Jul 2017 16:21:42 +0200 Message-ID: References: <1501331711-12961-1-git-send-email-dplotnikov@virtuozzo.com> <1501331711-12961-6-git-send-email-dplotnikov@virtuozzo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Cc: rkagan@virtuozzo.com, den@virtuozzo.com, svt-core@lists.sw.ru To: Denis Plotnikov , rkrcmar@redhat.com, kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:50994 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750987AbdGaOVp (ORCPT ); Mon, 31 Jul 2017 10:21:45 -0400 In-Reply-To: <1501331711-12961-6-git-send-email-dplotnikov@virtuozzo.com> Content-Language: en-US Sender: kvm-owner@vger.kernel.org List-ID: On 29/07/2017 14:35, Denis Plotnikov wrote: > Now, L2 guests can't have a stable kvmclock while working over L1 with > a stable kvmclock. It is so just because of lack of functionality. > > The patch is a part of work making kvmclock stable in L2 if it works > over a stable kvmclock. > > Signed-off-by: Denis Plotnikov > --- > arch/x86/kernel/pvclock.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c > index a2c554a..5b0bb2e 100644 > --- a/arch/x86/kernel/pvclock.c > +++ b/arch/x86/kernel/pvclock.c > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -73,6 +74,8 @@ u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src) > return flags & valid_flags; > } > > +static atomic64_t clocksource_stable = ATOMIC64_INIT(0); No need for atomic64. Otherwise looks good. Paolo > u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src, u64 *cycles) > { > unsigned version; > @@ -96,10 +99,20 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src, u64 *cycles) > pvclock_touch_watchdogs(); > } > > - if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && > - (flags & PVCLOCK_TSC_STABLE_BIT)) > - return ret; > + if (likely(valid_flags & PVCLOCK_TSC_STABLE_BIT)) { > + bool stable_now = !!(flags & PVCLOCK_TSC_STABLE_BIT); > + bool stable_last = (bool) atomic64_read(&clocksource_stable); > + > + if (unlikely(stable_now != stable_last)) { > + /* send notification once */ > + if (stable_last == atomic64_cmpxchg( > + &clocksource_stable, stable_last, stable_now)) > + clocksource_changes_notify(); > + } > > + if (stable_now) > + return ret; > + } > /* > * Assumption here is that last_value, a global accumulator, always goes > * forward. If we are less than that, we should not be much smaller. >