diff mbox series

[RFC,v6,4/7] time: Add mechanism to recognize clocksource in time_get_snapshot

Message ID 20191024110209.21328-5-jianyong.wu@arm.com (mailing list archive)
State New, archived
Headers show
Series Enable ptp_kvm for arm64 | expand

Commit Message

Jianyong Wu Oct. 24, 2019, 11:02 a.m. UTC
From: Thomas Gleixner <tglx@linutronix.de>
In some scenario like return device time to ptp_kvm guest,
we need identify the current clocksource outside core time code.
This patch add a mechanism to recognize the current clocksource
by export clocksource id in time_get_snapshot.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
---
 include/linux/clocksource.h |  6 ++++++
 include/linux/timekeeping.h | 12 +++++++-----
 kernel/time/clocksource.c   |  3 +++
 kernel/time/timekeeping.c   |  1 +
 4 files changed, 17 insertions(+), 5 deletions(-)

Comments

Thomas Gleixner Nov. 7, 2019, 7:55 a.m. UTC | #1
On Thu, 24 Oct 2019, Jianyong Wu wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
>
> In some scenario like return device time to ptp_kvm guest,
> we need identify the current clocksource outside core time code.
>
> This patch add a mechanism to recognize the current clocksource
> by export clocksource id in time_get_snapshot.

Please check Documentation/process/submitting-patches.rst and search for
'This patch'.

> diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
> index b21db536fd52..ac8016b22734 100644
> --- a/include/linux/clocksource.h
> +++ b/include/linux/clocksource.h
> @@ -19,6 +19,7 @@
>  #include <linux/of.h>
>  #include <asm/div64.h>
>  #include <asm/io.h>
> +#include <linux/clocksource_ids.h>

Please place that include to the other linux includes. You might notice
that there is ordering here.

But where is that include? It's not part of that series, so how is this
supposed to compile?

Thanks,

	tglx
Jianyong Wu Nov. 8, 2019, 2:34 a.m. UTC | #2
Hi tglx,

> -----Original Message-----
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Thursday, November 7, 2019 3:56 PM
> To: Jianyong Wu (Arm Technology China) <Jianyong.Wu@arm.com>
> Cc: 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>; 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 (Arm Technology China)
> <Kaly.Xin@arm.com>; Justin He (Arm Technology China)
> <Justin.He@arm.com>; nd <nd@arm.com>
> Subject: Re: [RFC PATCH v6 4/7] time: Add mechanism to recognize
> clocksource in time_get_snapshot
> 
> On Thu, 24 Oct 2019, Jianyong Wu wrote:
> > From: Thomas Gleixner <tglx@linutronix.de>
> >
> > In some scenario like return device time to ptp_kvm guest, we need
> > identify the current clocksource outside core time code.
> >
> > This patch add a mechanism to recognize the current clocksource by
> > export clocksource id in time_get_snapshot.
> 
> Please check Documentation/process/submitting-patches.rst and search for
> 'This patch'.
> 

Yeah, the expression should be more impersonal.

> > diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
> > index b21db536fd52..ac8016b22734 100644
> > --- a/include/linux/clocksource.h
> > +++ b/include/linux/clocksource.h
> > @@ -19,6 +19,7 @@
> >  #include <linux/of.h>
> >  #include <asm/div64.h>
> >  #include <asm/io.h>
> > +#include <linux/clocksource_ids.h>
> 
> Please place that include to the other linux includes. You might notice that
> there is ordering here.
>
Ok, 
 
> But where is that include? It's not part of that series, so how is this supposed
> to compile?

OMG! Sorry, I added this file when I prepared my patches but missed to include it into this patch! This must be avoid latter.

Thanks
Jianyong

> 
> Thanks,
> 
> 	tglx
diff mbox series

Patch

diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index b21db536fd52..ac8016b22734 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -19,6 +19,7 @@ 
 #include <linux/of.h>
 #include <asm/div64.h>
 #include <asm/io.h>
+#include <linux/clocksource_ids.h>
 
 struct clocksource;
 struct module;
@@ -49,6 +50,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.
  * @read:		returns a cycle value, passes clocksource as argument
  * @enable:		optional function to enable the clocksource
  * @disable:		optional function to disable the clocksource
@@ -91,6 +96,7 @@  struct clocksource {
 	const char *name;
 	struct list_head list;
 	int rating;
+	enum clocksource_ids id;
 	int (*enable)(struct clocksource *cs);
 	void (*disable)(struct clocksource *cs);
 	unsigned long flags;
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index a8ab0f143ac4..ecce56269a7e 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -2,6 +2,7 @@ 
 #ifndef _LINUX_TIMEKEEPING_H
 #define _LINUX_TIMEKEEPING_H
 
+#include <linux/clocksource_ids.h>
 #include <linux/errno.h>
 
 /* Included from linux/ktime.h */
@@ -204,11 +205,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 3bcc19ceb073..26a3add61771 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -921,6 +921,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;
+
 	/* Initialize mult/shift and max_idle_ns */
 	__clocksource_update_freq_scale(cs, scale, freq);
 
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 44b726bab4bd..88078cff7fe2 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -974,6 +974,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,