Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp6099087ybl; Tue, 14 Jan 2020 21:51:50 -0800 (PST) X-Google-Smtp-Source: APXvYqyfgUJliesarIH+XBt/0iJ4FMogZeQZOn6k44K3v6ctzRUa5c6aT5bQ+yimhwS/03iZREEz X-Received: by 2002:a05:6830:2361:: with SMTP id r1mr1541655oth.88.1579067510066; Tue, 14 Jan 2020 21:51:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579067510; cv=none; d=google.com; s=arc-20160816; b=Mckzdgr1MeWqQ7soodIhkXiCEWog+VQ+udN4xj8prJEJeu9nJqHpywj/e2P8i9/cDj S/eztYO44meYAFQOMtY4KMTLg6KSxuvQzrcUaqhz49tFFMsSE2SUV8aZTOp5Sx0BLx/M GCuuyI9k5e8ywMrRN0OQPyO3vFl1nrlkXHtEI9zNszxtRtxeZ8YVmtvO5TONvwEiihtm bLGRiT1jLguJa+BzFbg9Pvuy1T9ZQ+Lrqce5KEpziyWXHAJDbvYRNmXvOAqKFDqVvchc UMXJ7N2NFDVK1ViL+eOCM/kJt51TynB+SrVfSOjjlaSesk2WfM2YPxdC/Y4CyxiRdqEp Q0fw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=PONqyG5Kwmo6UAIvhChfBPV3SHZxCs6ee9uKMcSL3Yg=; b=aH6oGByaVDLnHj9sdCwECtIYnLMGIwpefFSWDN60QypGek9JnGEUqBS2Lahch8No5G VV9sJTYImTOmFDdmbsHD312DLNNAUo/AI+2ANi+O0H34zVI4qG7/MpcAsLHZ/cDA/pF1 4EieXoxcVc3qUzH81UsQb04Mj3AKLL4X5eT340IIR5Vy+IiRfcPqUl9eREsViGR07fUk F43qNMbmUEmlBTA36rNWsMtjCQymLn/doqdRR56I/V4udSqcvKUL/OtYD5xGpSDO8kEK nA+JImiu/GdMfVjIe9n62ff+YN4GBjzK9MXiaXFS6MhzvW0FpogT4lUm+ph1W12qlmHG e4SQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@c-s.fr header.s=mail header.b=WuomRfzE; 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 d192si8903960oig.21.2020.01.14.21.51.38; Tue, 14 Jan 2020 21:51:50 -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; dkim=pass header.i=@c-s.fr header.s=mail header.b=WuomRfzE; 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 S1726165AbgAOFuq (ORCPT + 99 others); Wed, 15 Jan 2020 00:50:46 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:31502 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725962AbgAOFuq (ORCPT ); Wed, 15 Jan 2020 00:50:46 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 47yGdY5Y7Pz9txw1; Wed, 15 Jan 2020 06:50:41 +0100 (CET) Authentication-Results: localhost; dkim=pass reason="1024-bit key; insecure key" header.d=c-s.fr header.i=@c-s.fr header.b=WuomRfzE; dkim-adsp=pass; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id mfKxcG6g7OTA; Wed, 15 Jan 2020 06:50:41 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 47yGdY4FZlz9txvv; Wed, 15 Jan 2020 06:50:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=c-s.fr; s=mail; t=1579067441; bh=PONqyG5Kwmo6UAIvhChfBPV3SHZxCs6ee9uKMcSL3Yg=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=WuomRfzENnS/htWG636a1i0bPlff4pugt/mQvNuJeB6mdXOTXUO1NrZoXElV8krfN 8VwgMu7W4cZIFi16miIZflnhS+IHZfN0lR4gdSH4OxfJgyLv/A3wfWvWJphUTIOAUC 3Fd0Mr4tqVEvZpHTRCcHdOS4X8s5d9VSxqosFVvs= Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 5D2F28B77E; Wed, 15 Jan 2020 06:50:42 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id 5h25OqE_qAEg; Wed, 15 Jan 2020 06:50:42 +0100 (CET) Received: from [172.25.230.100] (po15451.idsi0.si.c-s.fr [172.25.230.100]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 1149E8B774; Wed, 15 Jan 2020 06:50:42 +0100 (CET) Subject: Re: [patch 09/15] clocksource: Add common vdso clock mode storage To: Thomas Gleixner , LKML Cc: x86@kernel.org, John Stultz , Vincenzo Frascino , Andy Lutomirski , 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 References: <20200114185237.273005683@linutronix.de> <20200114185947.500141436@linutronix.de> From: Christophe Leroy Message-ID: Date: Wed, 15 Jan 2020 06:50:42 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 MIME-Version: 1.0 In-Reply-To: <20200114185947.500141436@linutronix.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 14/01/2020 à 19:52, Thomas Gleixner a écrit : > 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; gcc will claim 'mode' is unused when CONFIG_GENERIC_VDSO_CLOCK_MODE is not defined. > > /* 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 Can we do : #ifdef CONFIG_GENERIC_VDSO_CLOCK_MODE mode = tk->tkr_mono.clock->vdso_clock_mode; #else mode = __arch_get_clock_mode(tk); #endif vdata[CS_HRES_COARSE].clock_mode = mode; vdata[CS_RAW].clock_mode = mode; Christophe > > /* 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); >