* [patch 0/3] timekeeping: Janitorial updates
@ 2022-04-15 9:19 Thomas Gleixner
2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Thomas Gleixner @ 2022-04-15 9:19 UTC (permalink / raw)
To: LKML; +Cc: Peter Zijlstra, John Stultz, Stephen Boyd
The following series provides a few minor fixlets and consolidation:
- Add a missing data_race() annotation
- Ensure that the clock readout is always inlined
- Reduce the copy & pasta in the NMI safe accessors
Thanks,
tglx
---
timekeeping.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
^ permalink raw reply [flat|nested] 11+ messages in thread* [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() 2022-04-15 9:19 [patch 0/3] timekeeping: Janitorial updates Thomas Gleixner @ 2022-04-15 9:19 ` Thomas Gleixner 2022-04-15 12:07 ` Peter Zijlstra 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner 2022-04-15 9:19 ` [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline Thomas Gleixner 2022-04-15 9:19 ` [patch 3/3] timekeeping: Consolidate fast timekeeper Thomas Gleixner 2 siblings, 2 replies; 11+ messages in thread From: Thomas Gleixner @ 2022-04-15 9:19 UTC (permalink / raw) To: LKML; +Cc: Peter Zijlstra, John Stultz, Stephen Boyd Accessing timekeeper::offset_boot in ktime_get_boot_fast_ns() is an intended data race as the reader side cannot synchronize with a writer and there is no space in struct tk_read_base of the NMI safe timekeeper. Mark it so. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- kernel/time/timekeeping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -528,7 +528,7 @@ u64 notrace ktime_get_boot_fast_ns(void) { struct timekeeper *tk = &tk_core.timekeeper; - return (ktime_get_mono_fast_ns() + ktime_to_ns(tk->offs_boot)); + return (ktime_get_mono_fast_ns() + ktime_to_ns(data_race(tk->offs_boot))); } EXPORT_SYMBOL_GPL(ktime_get_boot_fast_ns); ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() 2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner @ 2022-04-15 12:07 ` Peter Zijlstra 2022-04-15 21:46 ` Thomas Gleixner 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner 1 sibling, 1 reply; 11+ messages in thread From: Peter Zijlstra @ 2022-04-15 12:07 UTC (permalink / raw) To: Thomas Gleixner; +Cc: LKML, John Stultz, Stephen Boyd On Fri, Apr 15, 2022 at 11:19:35AM +0200, Thomas Gleixner wrote: > Accessing timekeeper::offset_boot in ktime_get_boot_fast_ns() is an > intended data race as the reader side cannot synchronize with a writer and > there is no space in struct tk_read_base of the NMI safe timekeeper. > > Mark it so. If offs_boot actually ever changed? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() 2022-04-15 12:07 ` Peter Zijlstra @ 2022-04-15 21:46 ` Thomas Gleixner 0 siblings, 0 replies; 11+ messages in thread From: Thomas Gleixner @ 2022-04-15 21:46 UTC (permalink / raw) To: Peter Zijlstra; +Cc: LKML, John Stultz, Stephen Boyd On Fri, Apr 15 2022 at 14:07, Peter Zijlstra wrote: > On Fri, Apr 15, 2022 at 11:19:35AM +0200, Thomas Gleixner wrote: >> Accessing timekeeper::offset_boot in ktime_get_boot_fast_ns() is an >> intended data race as the reader side cannot synchronize with a writer and >> there is no space in struct tk_read_base of the NMI safe timekeeper. >> >> Mark it so. > > If offs_boot actually ever changed? Yes, during resume to compensate for the time spent in suspend. So, yes the data_race() is more of documentary value. Thanks, tglx ^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: timers/core] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() 2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner 2022-04-15 12:07 ` Peter Zijlstra @ 2022-05-02 12:04 ` tip-bot2 for Thomas Gleixner 1 sibling, 0 replies; 11+ messages in thread From: tip-bot2 for Thomas Gleixner @ 2022-05-02 12:04 UTC (permalink / raw) To: linux-tip-commits; +Cc: Thomas Gleixner, x86, linux-kernel The following commit has been merged into the timers/core branch of tip: Commit-ID: eff4849f928f2b90402907e06a6de1619cf16b1a Gitweb: https://git.kernel.org/tip/eff4849f928f2b90402907e06a6de1619cf16b1a Author: Thomas Gleixner <tglx@linutronix.de> AuthorDate: Fri, 15 Apr 2022 11:19:35 +02:00 Committer: Thomas Gleixner <tglx@linutronix.de> CommitterDate: Mon, 02 May 2022 14:00:20 +02:00 timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Accessing timekeeper::offset_boot in ktime_get_boot_fast_ns() is an intended data race as the reader side cannot synchronize with a writer and there is no space in struct tk_read_base of the NMI safe timekeeper. Mark it so. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20220415091920.956045162@linutronix.de --- kernel/time/timekeeping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 2c22023..3479804 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -528,7 +528,7 @@ u64 notrace ktime_get_boot_fast_ns(void) { struct timekeeper *tk = &tk_core.timekeeper; - return (ktime_get_mono_fast_ns() + ktime_to_ns(tk->offs_boot)); + return (ktime_get_mono_fast_ns() + ktime_to_ns(data_race(tk->offs_boot))); } EXPORT_SYMBOL_GPL(ktime_get_boot_fast_ns); ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline 2022-04-15 9:19 [patch 0/3] timekeeping: Janitorial updates Thomas Gleixner 2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner @ 2022-04-15 9:19 ` Thomas Gleixner 2022-04-15 12:09 ` Peter Zijlstra 2022-04-15 9:19 ` [patch 3/3] timekeeping: Consolidate fast timekeeper Thomas Gleixner 2 siblings, 1 reply; 11+ messages in thread From: Thomas Gleixner @ 2022-04-15 9:19 UTC (permalink / raw) To: LKML; +Cc: Peter Zijlstra, John Stultz, Stephen Boyd Compilers can uninline this which makes the notrace annotation of the NMI safe accessors moot. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- kernel/time/timekeeping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -186,7 +186,7 @@ static inline void tk_update_sleep_time( * a read of the fast-timekeeper tkrs (which is protected by its own locking * and update logic). */ -static inline u64 tk_clock_read(const struct tk_read_base *tkr) +static __always_inline u64 tk_clock_read(const struct tk_read_base *tkr) { struct clocksource *clock = READ_ONCE(tkr->clock); ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline 2022-04-15 9:19 ` [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline Thomas Gleixner @ 2022-04-15 12:09 ` Peter Zijlstra 2022-04-15 21:48 ` Thomas Gleixner 0 siblings, 1 reply; 11+ messages in thread From: Peter Zijlstra @ 2022-04-15 12:09 UTC (permalink / raw) To: Thomas Gleixner; +Cc: LKML, John Stultz, Stephen Boyd On Fri, Apr 15, 2022 at 11:19:36AM +0200, Thomas Gleixner wrote: > Compilers can uninline this which makes the notrace annotation of the NMI > safe accessors moot. inline already implies notrace. No objection to making it __always_inline, but this reason doesn't really work. > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > --- > kernel/time/timekeeping.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > --- a/kernel/time/timekeeping.c > +++ b/kernel/time/timekeeping.c > @@ -186,7 +186,7 @@ static inline void tk_update_sleep_time( > * a read of the fast-timekeeper tkrs (which is protected by its own locking > * and update logic). > */ > -static inline u64 tk_clock_read(const struct tk_read_base *tkr) > +static __always_inline u64 tk_clock_read(const struct tk_read_base *tkr) > { > struct clocksource *clock = READ_ONCE(tkr->clock); > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline 2022-04-15 12:09 ` Peter Zijlstra @ 2022-04-15 21:48 ` Thomas Gleixner 0 siblings, 0 replies; 11+ messages in thread From: Thomas Gleixner @ 2022-04-15 21:48 UTC (permalink / raw) To: Peter Zijlstra; +Cc: LKML, John Stultz, Stephen Boyd On Fri, Apr 15 2022 at 14:09, Peter Zijlstra wrote: > On Fri, Apr 15, 2022 at 11:19:36AM +0200, Thomas Gleixner wrote: >> Compilers can uninline this which makes the notrace annotation of the NMI >> safe accessors moot. > > inline already implies notrace. Bah. Confused myself vs. noinstr. We have too many constraints... > No objection to making it __always_inline, but this reason doesn't > really work. Let me come up with a more coherent argument. Thanks, tglx ^ permalink raw reply [flat|nested] 11+ messages in thread
* [patch 3/3] timekeeping: Consolidate fast timekeeper 2022-04-15 9:19 [patch 0/3] timekeeping: Janitorial updates Thomas Gleixner 2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner 2022-04-15 9:19 ` [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline Thomas Gleixner @ 2022-04-15 9:19 ` Thomas Gleixner 2022-04-15 12:09 ` Peter Zijlstra 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner 2 siblings, 2 replies; 11+ messages in thread From: Thomas Gleixner @ 2022-04-15 9:19 UTC (permalink / raw) To: LKML; +Cc: Peter Zijlstra, John Stultz, Stephen Boyd Provide a inline function which replaces the copy & pasta. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- kernel/time/timekeeping.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -429,6 +429,14 @@ static void update_fast_timekeeper(const memcpy(base + 1, base, sizeof(*base)); } +static __always_inline u64 fast_tk_get_delta_ns(struct tk_read_base *tkr) +{ + u64 delta, cycles = tk_clock_read(tkr); + + delta = clocksource_delta(cycles, tkr->cycle_last, tkr->mask); + return timekeeping_delta_to_ns(tkr, delta); +} + static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf) { struct tk_read_base *tkr; @@ -439,12 +447,7 @@ static __always_inline u64 __ktime_get_f seq = raw_read_seqcount_latch(&tkf->seq); tkr = tkf->base + (seq & 0x01); now = ktime_to_ns(tkr->base); - - now += timekeeping_delta_to_ns(tkr, - clocksource_delta( - tk_clock_read(tkr), - tkr->cycle_last, - tkr->mask)); + now += fast_tk_get_delta_ns(tkr); } while (read_seqcount_latch_retry(&tkf->seq, seq)); return now; @@ -560,10 +563,7 @@ static __always_inline u64 __ktime_get_r tkr = tkf->base + (seq & 0x01); basem = ktime_to_ns(tkr->base); baser = ktime_to_ns(tkr->base_real); - - delta = timekeeping_delta_to_ns(tkr, - clocksource_delta(tk_clock_read(tkr), - tkr->cycle_last, tkr->mask)); + delta = fast_tk_get_delta_ns(tkr); } while (read_seqcount_latch_retry(&tkf->seq, seq)); if (mono) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch 3/3] timekeeping: Consolidate fast timekeeper 2022-04-15 9:19 ` [patch 3/3] timekeeping: Consolidate fast timekeeper Thomas Gleixner @ 2022-04-15 12:09 ` Peter Zijlstra 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner 1 sibling, 0 replies; 11+ messages in thread From: Peter Zijlstra @ 2022-04-15 12:09 UTC (permalink / raw) To: Thomas Gleixner; +Cc: LKML, John Stultz, Stephen Boyd On Fri, Apr 15, 2022 at 11:19:38AM +0200, Thomas Gleixner wrote: > Provide a inline function which replaces the copy & pasta. > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: timers/core] timekeeping: Consolidate fast timekeeper 2022-04-15 9:19 ` [patch 3/3] timekeeping: Consolidate fast timekeeper Thomas Gleixner 2022-04-15 12:09 ` Peter Zijlstra @ 2022-05-02 12:04 ` tip-bot2 for Thomas Gleixner 1 sibling, 0 replies; 11+ messages in thread From: tip-bot2 for Thomas Gleixner @ 2022-05-02 12:04 UTC (permalink / raw) To: linux-tip-commits Cc: Thomas Gleixner, Peter Zijlstra (Intel), x86, linux-kernel The following commit has been merged into the timers/core branch of tip: Commit-ID: 90be8d6c1f91e1e5121c219726524c91b52bfc20 Gitweb: https://git.kernel.org/tip/90be8d6c1f91e1e5121c219726524c91b52bfc20 Author: Thomas Gleixner <tglx@linutronix.de> AuthorDate: Fri, 15 Apr 2022 11:19:38 +02:00 Committer: Thomas Gleixner <tglx@linutronix.de> CommitterDate: Mon, 02 May 2022 14:00:20 +02:00 timekeeping: Consolidate fast timekeeper Provide a inline function which replaces the copy & pasta. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20220415091921.072296632@linutronix.de --- kernel/time/timekeeping.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 3479804..8895ff2 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -429,6 +429,14 @@ static void update_fast_timekeeper(const struct tk_read_base *tkr, memcpy(base + 1, base, sizeof(*base)); } +static __always_inline u64 fast_tk_get_delta_ns(struct tk_read_base *tkr) +{ + u64 delta, cycles = tk_clock_read(tkr); + + delta = clocksource_delta(cycles, tkr->cycle_last, tkr->mask); + return timekeeping_delta_to_ns(tkr, delta); +} + static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf) { struct tk_read_base *tkr; @@ -439,12 +447,7 @@ static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf) seq = raw_read_seqcount_latch(&tkf->seq); tkr = tkf->base + (seq & 0x01); now = ktime_to_ns(tkr->base); - - now += timekeeping_delta_to_ns(tkr, - clocksource_delta( - tk_clock_read(tkr), - tkr->cycle_last, - tkr->mask)); + now += fast_tk_get_delta_ns(tkr); } while (read_seqcount_latch_retry(&tkf->seq, seq)); return now; @@ -560,10 +563,7 @@ static __always_inline u64 __ktime_get_real_fast(struct tk_fast *tkf, u64 *mono) tkr = tkf->base + (seq & 0x01); basem = ktime_to_ns(tkr->base); baser = ktime_to_ns(tkr->base_real); - - delta = timekeeping_delta_to_ns(tkr, - clocksource_delta(tk_clock_read(tkr), - tkr->cycle_last, tkr->mask)); + delta = fast_tk_get_delta_ns(tkr); } while (read_seqcount_latch_retry(&tkf->seq, seq)); if (mono) ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-05-02 12:04 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-04-15 9:19 [patch 0/3] timekeeping: Janitorial updates Thomas Gleixner 2022-04-15 9:19 ` [patch 1/3] timekeeping: Annotate ktime_get_boot_fast_ns() with data_race() Thomas Gleixner 2022-04-15 12:07 ` Peter Zijlstra 2022-04-15 21:46 ` Thomas Gleixner 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner 2022-04-15 9:19 ` [patch 2/3] timekeeping: Mark tk_clock_read() __always_inline Thomas Gleixner 2022-04-15 12:09 ` Peter Zijlstra 2022-04-15 21:48 ` Thomas Gleixner 2022-04-15 9:19 ` [patch 3/3] timekeeping: Consolidate fast timekeeper Thomas Gleixner 2022-04-15 12:09 ` Peter Zijlstra 2022-05-02 12:04 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.