Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp5609379ybl; Tue, 14 Jan 2020 11:50:19 -0800 (PST) X-Google-Smtp-Source: APXvYqwRrfDGZ8HVHU1y5r+GW1Q4rN4VKzexFfXfP5yDmKo5k4zxeYw3DyX73EheU0pDhjrdd6NO X-Received: by 2002:a9d:6c99:: with SMTP id c25mr13473otr.178.1579031419402; Tue, 14 Jan 2020 11:50:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579031419; cv=none; d=google.com; s=arc-20160816; b=zHF+U1FtZvM8DGeofYsxp/T34RQ25Tzz+hw2dnPzJGxO5jyKgMiVrBppp1x+efCuSU D6jf3QfjLJl1CjZ53UH+fGJnNid5mY9nYngeTZGEKAqCo3aPtZRapYd+0NFFgDZrjSzJ RVaBXELJgKsTVn2jqsx8ZTpM+SqXr5iS6+BRVOvCXHAwoD3+Zs6ZcdeZCRkuSRjVKuVp EXRYcbcVofU/qMk0Xx7nGvZ3FQGZAwK3XLfG/2SAHvNdfTlE4i3fSQh8awCuIpS2YaJz 3TdQ0xPczQMgFPbw2JxYPuBbdp5m+6skBS23SkdhosE1d2STqIeGRHNwBfAe+3jJSkWE 9YbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:subject:cc:to :from:date:user-agent:message-id; bh=9mrgWXm/SYSu8fRQMvKuLj3WjS4H7LkSqGo9GjXaecE=; b=OYcJ27WtyO3pn4YSuQP8G9L106/or4zg9HNXLnQ1exYasz2hyTqOUWDhJEPxzVAaNd CUtbKi9dyEzj+EECkzZp92z+xYFpltcKJjqh4m2EVeCZ2K6S6xhcUkDlD1A9/BhTMDFr Hmmxa5BQyCw5hEl49sWRbHurtPhOqo1ZDV/n6f21ifdvp4an2UCZtKZ1OAGm3S3jJsbt 6bdE7R0xq3XjdLnONPqLFcz8fflJBKyVSdikutwxXPTf/63R/nneKGDDwRpdBvxfeaE4 93BIrksP7Q2x0wdRtJn7LC4W2e/IWcOyy7hAOk9Z3xvsuot1OuueNYgnZLAiDiY18N7e pogg== 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 w196si8389473oia.135.2020.01.14.11.50.08; Tue, 14 Jan 2020 11:50:19 -0800 (PST) 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 S1728966AbgANTtN (ORCPT + 99 others); Tue, 14 Jan 2020 14:49:13 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:44740 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728865AbgANTtJ (ORCPT ); Tue, 14 Jan 2020 14:49:09 -0500 Received: from localhost ([127.0.0.1] helo=nanos.tec.linutronix.de) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1irSBW-0005aF-UR; Tue, 14 Jan 2020 20:49:07 +0100 Message-Id: <20200114185947.500141436@linutronix.de> User-Agent: quilt/0.65 Date: Tue, 14 Jan 2020 19:52:46 +0100 From: Thomas Gleixner To: LKML Cc: x86@kernel.org, John Stultz , Vincenzo Frascino , Andy Lutomirski , Christophe Leroy , Paolo Bonzini , Boris Ostrovsky , Juergen Gross , Haiyang Zhang , Sasha Levin , Ralf Baechle , Paul Burton , James Hogan , Russell King , Catalin Marinas , Will Deacon , Mark Rutland , Marc Zyngier Subject: [patch 09/15] clocksource: Add common vdso clock mode storage References: <20200114185237.273005683@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org All architectures which use the generic VDSO code have their own storage for the VDSO clock mode. That's pointless and just requires duplicate code. Provide generic storage for it. The new Kconfig symbol is intermediate and will be removed once all architectures are converted over. Signed-off-by: Thomas Gleixner --- include/linux/clocksource.h | 12 +++++++++++- kernel/time/clocksource.c | 9 +++++++++ kernel/time/vsyscall.c | 7 +++++++ lib/vdso/Kconfig | 3 +++ lib/vdso/gettimeofday.c | 13 +++++++++++-- 5 files changed, 41 insertions(+), 3 deletions(-) --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -23,10 +23,19 @@ struct clocksource; struct module; -#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA +#if defined(CONFIG_ARCH_CLOCKSOURCE_DATA) || \ + defined(CONFIG_GENERIC_VDSO_CLOCK_MODE) #include #endif +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE, +#ifdef CONFIG_GENERIC_VDSO_CLOCK_MODE + VDSO_ARCH_CLOCKMODES, +#endif + VDSO_CLOCKMODE_MAX, +}; + /** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-free accessors to the underlying hardware. @@ -97,6 +106,7 @@ struct clocksource { const char *name; struct list_head list; int rating; + enum vdso_clock_mode vdso_clock_mode; unsigned long flags; int (*enable)(struct clocksource *cs); --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -921,6 +921,15 @@ int __clocksource_register_scale(struct clocksource_arch_init(cs); +#ifdef CONFIG_GENERIC_VDSO_CLOCK_MODE + if (cs->vdso_clock_mode < 0 || + cs->vdso_clock_mode >= VDSO_CLOCKMODE_MAX) { + pr_warn("clocksource %s registered with invalid VDSO mode %d. Disabling VDSO support.\n", + cs->name, cs->vdso_clock_mode); + cs->vdso_clock_mode = VDSO_CLOCKMODE_NONE; + } +#endif + /* Initialize mult/shift and max_idle_ns */ __clocksource_update_freq_scale(cs, scale, freq); --- a/kernel/time/vsyscall.c +++ b/kernel/time/vsyscall.c @@ -72,12 +72,19 @@ void update_vsyscall(struct timekeeper * struct vdso_data *vdata = __arch_get_k_vdso_data(); struct vdso_timestamp *vdso_ts; u64 nsec; + s32 mode; /* copy vsyscall data */ vdso_write_begin(vdata); +#ifdef CONFIG_GENERIC_VDSO_CLOCK_MODE + mode = tk->tkr_mono.clock->vdso_clock_mode; + vdata[CS_HRES_COARSE].clock_mode = mode; + vdata[CS_RAW].clock_mode = mode; +#else vdata[CS_HRES_COARSE].clock_mode = __arch_get_clock_mode(tk); vdata[CS_RAW].clock_mode = __arch_get_clock_mode(tk); +#endif /* CLOCK_REALTIME also required for time() */ vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME]; --- a/lib/vdso/Kconfig +++ b/lib/vdso/Kconfig @@ -30,4 +30,7 @@ config GENERIC_VDSO_TIME_NS Selected by architectures which support time namespaces in the VDSO +config GENERIC_VDSO_CLOCK_MODE + bool + endif --- a/lib/vdso/gettimeofday.c +++ b/lib/vdso/gettimeofday.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -64,10 +65,14 @@ static int do_hres_timens(const struct v do { seq = vdso_read_begin(vd); + if (IS_ENABLED(CONFIG_GENERIC_VDSO_CLOCK_MODE) && + vd->clock_mode == VDSO_CLOCKMODE_NONE) + return -1; cycles = __arch_get_hw_counter(vd->clock_mode); ns = vdso_ts->nsec; last = vd->cycle_last; - if (unlikely((s64)cycles < 0)) + if (!IS_ENABLED(CONFIG_GENERIC_VDSO_CLOCK_MODE) && + unlikely((s64)cycles < 0)) return -1; ns += vdso_calc_delta(cycles, last, vd->mask, vd->mult); @@ -132,10 +137,14 @@ static __always_inline int do_hres(const } smp_rmb(); + if (IS_ENABLED(CONFIG_GENERIC_VDSO_CLOCK_MODE) && + vd->clock_mode == VDSO_CLOCKMODE_NONE) + return -1; cycles = __arch_get_hw_counter(vd->clock_mode); ns = vdso_ts->nsec; last = vd->cycle_last; - if (unlikely((s64)cycles < 0)) + if (!IS_ENABLED(CONFIG_GENERIC_VDSO_CLOCK_MODE) && + unlikely((s64)cycles < 0)) return -1; ns += vdso_calc_delta(cycles, last, vd->mask, vd->mult);