From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933328AbdABTu6 (ORCPT ); Mon, 2 Jan 2017 14:50:58 -0500 Received: from mail-pg0-f44.google.com ([74.125.83.44]:35558 "EHLO mail-pg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755893AbdABTu4 (ORCPT ); Mon, 2 Jan 2017 14:50:56 -0500 Date: Mon, 2 Jan 2017 11:50:52 -0800 From: Stephen Hemminger To: Vitaly Kuznetsov Cc: devel@linuxdriverproject.org, Haiyang Zhang , Alex Ng , linux-kernel@vger.kernel.org, John Stultz , Thomas Gleixner Subject: Re: [PATCH 4/4] hv_util: improve time adjustment accuracy by disabling interrupts Message-ID: <20170102115052.1eb292d6@xeon-e3> In-Reply-To: <20170102194114.657-5-vkuznets@redhat.com> References: <20170102194114.657-1-vkuznets@redhat.com> <20170102194114.657-5-vkuznets@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2 Jan 2017 20:41:14 +0100 Vitaly Kuznetsov wrote: > If we happen to receive interrupts during hv_set_host_time() execution > our adjustments may get inaccurate. Make the whole function atomic. > Unfortunately, we can's call do_settimeofday64() with interrupts > disabled as some cross-CPU work is being done but this call happens > very rarely. > > Signed-off-by: Vitaly Kuznetsov > --- > drivers/hv/hv_util.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c > index 4c0fbb0..233d5cb 100644 > --- a/drivers/hv/hv_util.c > +++ b/drivers/hv/hv_util.c > @@ -186,6 +186,9 @@ static void hv_set_host_time(struct work_struct *work) > u64 newtime; > struct timespec64 host_ts, our_ts; > struct timex txc = {0}; > + unsigned long flags; > + > + local_irq_save(flags); > > wrk = container_of(work, struct adj_time_work, work); > > @@ -214,6 +217,7 @@ static void hv_set_host_time(struct work_struct *work) > > /* Try adjusting time by using phase adjustment if possible */ > if (abs(delta) > MAXPHASE) { > + local_irq_restore(flags); > do_settimeofday64(&host_ts); > return; > } > @@ -225,6 +229,8 @@ static void hv_set_host_time(struct work_struct *work) > txc.status = STA_PLL; > txc.offset = delta; > do_adjtimex(&txc); > + > + local_irq_restore(flags); Yes, it should be atomic, but local irq save/restore is not sufficient protection because it does not protect against premptible kernel. Why not a mutex? or a spinlock?