Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp105029imm; Fri, 31 Aug 2018 19:03:14 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdb97nqMRxjk5EFW+58ZCZRX7g3Qd1SAKzpd418tuF+wENI3JB+a777tGeYypCEZob/TpPeK X-Received: by 2002:a17:902:9a06:: with SMTP id v6-v6mr18202319plp.316.1535767394678; Fri, 31 Aug 2018 19:03:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535767394; cv=none; d=google.com; s=arc-20160816; b=P9J4xjconVBL56Jng0/9xkbzTNTDBceUxzBG9FzdzG9KMShPwB9KLYrDskfbbPLkk6 QpXgJrYp5E5kV8D/f7xELZYUa6bpKDQqN9wQI2DUURI5V+MsbrhH9YsaHCiK7PgFrnEd PxsweqzkTyAO/KOYNGvQzYohPb3nDQwGXPcmldgzfpKax1sz88RpzvVO8E0d8uuziVnv 3cLPyMK1WzsZctWO6CX57/tbHD5OSZhaXgDyIoCAmF2sdUfx/ZUBSGIbmzKKpbTZBHjg nzokrLa64fUwTSPXdalOY5mWHYrTi09G6jyHTVeUnlIWS/CB2iJywlNiPDX8NNkIs5x5 qs4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:message-id:subject:cc:cc:cc:cc:cc:to :from:arc-authentication-results; bh=VQEDubCQeuAlpz2PLFjut0JBux9XXkaPo6+Z0nDKGwM=; b=qWZ/ZvztDkv/sDMuZ4E8Yc4l3zD5WpKmu0hCYeKdOMk3mKD8XUdfvPAApIOPq15PfS 84qy2tmOCr2gYrSwha7TUjxgQirqQ5PzP5leJKCSJZbGu/NrduaYOCu2rAw/RSzB73NU LEbU0BADnZsfoC+mUxxmqVx9d/fB2AQXafgMWS6+OeSrgYRq/7tYQ5fh3MgBX3IEAoLb B9/BdOtIq8wP46hX8Z4QJiFCLg4aAMhFkscsU4OW+zbrNCoEKNKx3eynI8zDNAUUQy+B OglORUw75WNYnDRF8E/SZst77ngeun07X4u6cmX8RmvIWtgNbbXCmS7BRbPZJU6fSZzM BktA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s11-v6si11893835pfd.231.2018.08.31.19.02.30; Fri, 31 Aug 2018 19:03:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727379AbeIAGJw (ORCPT + 99 others); Sat, 1 Sep 2018 02:09:52 -0400 Received: from mail105.syd.optusnet.com.au ([211.29.132.249]:45302 "EHLO mail105.syd.optusnet.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727247AbeIAGJw (ORCPT ); Sat, 1 Sep 2018 02:09:52 -0400 Received: from smtp.starsoftware.com.au (n175-33-133-183.meb2.vic.optusnet.com.au [175.33.133.183]) by mail105.syd.optusnet.com.au (Postfix) with ESMTP id 4FD72104BA29; Sat, 1 Sep 2018 11:59:36 +1000 (AEST) Received: from virtux64.softrans.com.au (unknown [192.168.0.6]) by smtp.starsoftware.com.au (Postfix) with ESMTP id E87D4677E288; Sat, 1 Sep 2018 11:59:35 +1000 (AEST) Received: by virtux64.softrans.com.au (Postfix, from userid 1000) id CCF0B18E20A9; Sat, 1 Sep 2018 11:59:35 +1000 (AEST) From: Matt Rickard To: Thomas Gleixner Cc: Andy Lutomirski Cc: Stephen Boyd Cc: John Stultz Cc: X86 ML Cc: LKML Subject: [PATCH v3] x86/vdso: Handle clock_gettime(CLOCK_TAI) in vDSO Message-Id: <20180901015935.CCF0B18E20A9@virtux64.softrans.com.au> Date: Sat, 1 Sep 2018 11:59:35 +1000 (AEST) X-Optus-CM-Score: 0 X-Optus-CM-Analysis: v=2.2 cv=I9sVfJog c=1 sm=1 tr=0 a=0SUgGFgJIhXJJGNlngNSLg==:117 a=0SUgGFgJIhXJJGNlngNSLg==:17 a=JBFolyDoGHsA:10 a=PIVNZ80yAAAA:8 a=qvPKsAL-236YqDqrpyAA:9 a=3YJQTRF3V1zcZZCg0gjL:22 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Process clock_gettime(CLOCK_TAI) in vDSO. This makes the call about as fast as CLOCK_REALTIME and CLOCK_MONOTONIC: nanoseconds before after clockname ---- ----- --------- 233 87 CLOCK_TAI 96 93 CLOCK_REALTIME 88 87 CLOCK_MONOTONIC Signed-off-by: Matt Rickard --- arch/x86/entry/vdso/vclock_gettime.c | 25 +++++++++++++++++++++++++ arch/x86/entry/vsyscall/vsyscall_gtod.c | 2 ++ arch/x86/include/asm/vgtod.h | 1 + 3 files changed, 28 insertions(+) diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c index f19856d95c60..91ed1bb2a3bb 100644 --- a/arch/x86/entry/vdso/vclock_gettime.c +++ b/arch/x86/entry/vdso/vclock_gettime.c @@ -246,6 +246,27 @@ notrace static int __always_inline do_monotonic(struct timespec *ts) return mode; } +notrace static int __always_inline do_tai(struct timespec *ts) +{ + unsigned long seq; + u64 ns; + int mode; + + do { + seq = gtod_read_begin(gtod); + mode = gtod->vclock_mode; + ts->tv_sec = gtod->tai_time_sec; + ns = gtod->wall_time_snsec; + ns += vgetsns(&mode); + ns >>= gtod->shift; + } while (unlikely(gtod_read_retry(gtod, seq))); + + ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns); + ts->tv_nsec = ns; + + return mode; +} + notrace static void do_realtime_coarse(struct timespec *ts) { unsigned long seq; @@ -277,6 +298,10 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) if (do_monotonic(ts) == VCLOCK_NONE) goto fallback; break; + case CLOCK_TAI: + if (do_tai(ts) == VCLOCK_NONE) + goto fallback; + break; case CLOCK_REALTIME_COARSE: do_realtime_coarse(ts); break; diff --git a/arch/x86/entry/vsyscall/vsyscall_gtod.c b/arch/x86/entry/vsyscall/vsyscall_gtod.c index e1216dd95c04..d61392fe17f6 100644 --- a/arch/x86/entry/vsyscall/vsyscall_gtod.c +++ b/arch/x86/entry/vsyscall/vsyscall_gtod.c @@ -53,6 +53,8 @@ void update_vsyscall(struct timekeeper *tk) vdata->monotonic_time_snsec = tk->tkr_mono.xtime_nsec + ((u64)tk->wall_to_monotonic.tv_nsec << tk->tkr_mono.shift); + vdata->tai_time_sec = tk->xtime_sec + + tk->tai_offset; while (vdata->monotonic_time_snsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) { vdata->monotonic_time_snsec -= diff --git a/arch/x86/include/asm/vgtod.h b/arch/x86/include/asm/vgtod.h index fb856c9f0449..adc9f7b20b9c 100644 --- a/arch/x86/include/asm/vgtod.h +++ b/arch/x86/include/asm/vgtod.h @@ -32,6 +32,7 @@ struct vsyscall_gtod_data { gtod_long_t wall_time_coarse_nsec; gtod_long_t monotonic_time_coarse_sec; gtod_long_t monotonic_time_coarse_nsec; + gtod_long_t tai_time_sec; int tz_minuteswest; int tz_dsttime;