Message ID | 20200522083724.38182-6-jianyong.wu@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable ptp_kvm for arm64 | expand |
Jianyong Wu <jianyong.wu@arm.com> writes: > From: Thomas Gleixner <tglx@linutronix.de> > diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c > index 7cb09c4cf21c..a8f65b3e4ec8 100644 > --- a/kernel/time/clocksource.c > +++ b/kernel/time/clocksource.c > @@ -928,6 +928,9 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) > > clocksource_arch_init(cs); > > +if (WARN_ON_ONCE((unsigned int)cs->id >= CSID_MAX)) > + cs->id = CSID_GENERIC; > + This is white space damaged and certainly not from me.
Hi Thomas, > -----Original Message----- > From: Thomas Gleixner <tglx@linutronix.de> > Sent: Friday, May 29, 2020 12:36 AM > To: Jianyong Wu <Jianyong.Wu@arm.com>; netdev@vger.kernel.org; > yangbo.lu@nxp.com; john.stultz@linaro.org; pbonzini@redhat.com; > sean.j.christopherson@intel.com; maz@kernel.org; > richardcochran@gmail.com; Mark Rutland <Mark.Rutland@arm.com>; > will@kernel.org; Suzuki Poulose <Suzuki.Poulose@arm.com>; Steven Price > <Steven.Price@arm.com> > Cc: linux-kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > kvmarm@lists.cs.columbia.edu; kvm@vger.kernel.org; Steve Capper > <Steve.Capper@arm.com>; Kaly Xin <Kaly.Xin@arm.com>; Justin He > <Justin.He@arm.com>; Wei Chen <Wei.Chen@arm.com>; Jianyong Wu > <Jianyong.Wu@arm.com>; nd <nd@arm.com> > Subject: Re: [RFC PATCH v12 05/11] time: Add mechanism to recognize > clocksource in time_get_snapshot > > Jianyong Wu <jianyong.wu@arm.com> writes: > > From: Thomas Gleixner <tglx@linutronix.de> diff --git > > a/kernel/time/clocksource.c b/kernel/time/clocksource.c index > > 7cb09c4cf21c..a8f65b3e4ec8 100644 > > --- a/kernel/time/clocksource.c > > +++ b/kernel/time/clocksource.c > > @@ -928,6 +928,9 @@ int __clocksource_register_scale(struct > > clocksource *cs, u32 scale, u32 freq) > > > > clocksource_arch_init(cs); > > > > +if (WARN_ON_ONCE((unsigned int)cs->id >= CSID_MAX)) > > + cs->id = CSID_GENERIC; > > + > > This is white space damaged and certainly not from me. Sorry, I will fix it. Thanks Jianyong
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 86d143db6523..80d2a7e39630 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -17,6 +17,7 @@ #include <linux/timer.h> #include <linux/init.h> #include <linux/of.h> +#include <linux/clocksource_ids.h> #include <asm/div64.h> #include <asm/io.h> @@ -62,6 +63,10 @@ struct module; * 400-499: Perfect * The ideal clocksource. A must-use where * available. + @id: Defaults to CSID_GENERIC. The id value is captured + * in certain snapshot functions to allow callers to + * validate the clocksource from which the snapshot was + * taken. * @flags: Flags describing special properties * @enable: Optional function to enable the clocksource * @disable: Optional function to disable the clocksource @@ -100,6 +105,7 @@ struct clocksource { const char *name; struct list_head list; int rating; + enum clocksource_ids id; enum vdso_clock_mode vdso_clock_mode; unsigned long flags; diff --git a/include/linux/clocksource_ids.h b/include/linux/clocksource_ids.h new file mode 100644 index 000000000000..4d8e19e05328 --- /dev/null +++ b/include/linux/clocksource_ids.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_CLOCKSOURCE_IDS_H +#define _LINUX_CLOCKSOURCE_IDS_H + +/* Enum to give clocksources a unique identifier */ +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_MAX, +}; + +#endif diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h index b27e2ffa96c1..70e771862d20 100644 --- a/include/linux/timekeeping.h +++ b/include/linux/timekeeping.h @@ -3,6 +3,7 @@ #define _LINUX_TIMEKEEPING_H #include <linux/errno.h> +#include <linux/clocksource_ids.h> /* Included from linux/ktime.h */ @@ -232,11 +233,12 @@ extern void timekeeping_inject_sleeptime64(const struct timespec64 *delta); * @cs_was_changed_seq: The sequence number of clocksource change events */ struct system_time_snapshot { - u64 cycles; - ktime_t real; - ktime_t raw; - unsigned int clock_was_set_seq; - u8 cs_was_changed_seq; + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; }; /* diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 7cb09c4cf21c..a8f65b3e4ec8 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -928,6 +928,9 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) clocksource_arch_init(cs); +if (WARN_ON_ONCE((unsigned int)cs->id >= CSID_MAX)) + cs->id = CSID_GENERIC; + #ifdef CONFIG_GENERIC_VDSO_CLOCK_MODE if (cs->vdso_clock_mode < 0 || cs->vdso_clock_mode >= VDSO_CLOCKMODE_MAX) { diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 9ebaab13339d..a2e46b0151b6 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -979,6 +979,7 @@ void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot) do { seq = read_seqcount_begin(&tk_core.seq); now = tk_clock_read(&tk->tkr_mono); + systime_snapshot->cs_id = tk->tkr_mono.clock->id; systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq; systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq; base_real = ktime_add(tk->tkr_mono.base,