e5d4d1756b
seqlock consists of a sequence counter and a spinlock_t which is used to serialize the writers. spinlock_t is substituted by a "sleeping" spinlock on PREEMPT_RT enabled kernels which breaks the usage in the timekeeping code as the writers are executed in hard interrupt and therefore non-preemptible context even on PREEMPT_RT. The spinlock in seqlock cannot be unconditionally replaced by a raw_spinlock_t as many seqlock users have nesting spinlock sections or other code which is not suitable to run in truly atomic context on RT. Instead of providing a raw_seqlock API for a single use case, open code the seqlock for the jiffies use case and implement it with a raw_spinlock_t and a sequence counter. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20200321113242.120587764@linutronix.de
34 lines
926 B
C
34 lines
926 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _KERNEL_TIME_TIMEKEEPING_H
|
|
#define _KERNEL_TIME_TIMEKEEPING_H
|
|
/*
|
|
* Internal interfaces for kernel/time/
|
|
*/
|
|
extern ktime_t ktime_get_update_offsets_now(unsigned int *cwsseq,
|
|
ktime_t *offs_real,
|
|
ktime_t *offs_boot,
|
|
ktime_t *offs_tai);
|
|
|
|
extern int timekeeping_valid_for_hres(void);
|
|
extern u64 timekeeping_max_deferment(void);
|
|
extern void timekeeping_warp_clock(void);
|
|
extern int timekeeping_suspend(void);
|
|
extern void timekeeping_resume(void);
|
|
#ifdef CONFIG_GENERIC_SCHED_CLOCK
|
|
extern int sched_clock_suspend(void);
|
|
extern void sched_clock_resume(void);
|
|
#else
|
|
static inline int sched_clock_suspend(void) { return 0; }
|
|
static inline void sched_clock_resume(void) { }
|
|
#endif
|
|
|
|
extern void do_timer(unsigned long ticks);
|
|
extern void update_wall_time(void);
|
|
|
|
extern raw_spinlock_t jiffies_lock;
|
|
extern seqcount_t jiffies_seq;
|
|
|
|
#define CS_NAME_LEN 32
|
|
|
|
#endif
|