Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753032AbdHBO6U (ORCPT ); Wed, 2 Aug 2017 10:58:20 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:33505 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752976AbdHBO6T (ORCPT ); Wed, 2 Aug 2017 10:58:19 -0400 From: Denis Plotnikov To: pbonzini@redhat.com, rkrcmar@redhat.com, kvm@vger.kernel.org, john.stultz@linaro.org, tglx@linutronix.de Cc: mingo@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, x86@kernel.org, rkagan@virtuozzo.com, den@virtuozzo.com Subject: [PATCH v4 09/10] pvclock: add clocksource change notification on changing of tsc stable bit Date: Wed, 2 Aug 2017 17:38:09 +0300 Message-Id: <1501684690-211093-10-git-send-email-dplotnikov@virtuozzo.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1501684690-211093-1-git-send-email-dplotnikov@virtuozzo.com> References: <1501684690-211093-1-git-send-email-dplotnikov@virtuozzo.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1900 Lines: 59 It's needed to notify the KVM guest about critical changes in pvclock and make it to update its masterclock. This is a part of the work aiming to make kvmclock be a clocksource providing valid cycles value for KVM masterclock, another words make possible to use KVM masterclock over kvmclock clocksource. 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 bece384..5898f20 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 atomic_t clocksource_stable = ATOMIC_INIT(0); + u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src, u64 *cycles_stamp, u8 *flags_stamp) { @@ -102,10 +105,20 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src, 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) atomic_read(&clocksource_stable); + + if (unlikely(stable_now != stable_last)) { + /* send notification once */ + if (stable_last == atomic_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. -- 2.7.4