mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 08:03:01 +09:00
s390/time: Provide sched_clock_noinstr()
With the intent to provide local_clock_noinstr(), a variant of local_clock() that's safe to be called from noinstr code (with the assumption that any such code will already be non-preemptible), prepare for things by providing a noinstr sched_clock_noinstr() function. Specifically, preempt_enable_*() calls out to schedule(), which upsets noinstr validation efforts. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Heiko Carstens <hca@linux.ibm.com> Tested-by: Michael Kelley <mikelley@microsoft.com> # Hyper-V Link: https://lore.kernel.org/r/20230519102715.570170436@infradead.org
This commit is contained in:
@@ -63,7 +63,7 @@ static inline int store_tod_clock_ext_cc(union tod_clock *clk)
|
||||
return cc;
|
||||
}
|
||||
|
||||
static inline void store_tod_clock_ext(union tod_clock *tod)
|
||||
static __always_inline void store_tod_clock_ext(union tod_clock *tod)
|
||||
{
|
||||
asm volatile("stcke %0" : "=Q" (*tod) : : "cc");
|
||||
}
|
||||
@@ -177,7 +177,7 @@ static inline void local_tick_enable(unsigned long comp)
|
||||
|
||||
typedef unsigned long cycles_t;
|
||||
|
||||
static inline unsigned long get_tod_clock(void)
|
||||
static __always_inline unsigned long get_tod_clock(void)
|
||||
{
|
||||
union tod_clock clk;
|
||||
|
||||
@@ -204,6 +204,11 @@ void init_cpu_timer(void);
|
||||
|
||||
extern union tod_clock tod_clock_base;
|
||||
|
||||
static __always_inline unsigned long __get_tod_clock_monotonic(void)
|
||||
{
|
||||
return get_tod_clock() - tod_clock_base.tod;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_clock_monotonic - returns current time in clock rate units
|
||||
*
|
||||
@@ -216,7 +221,7 @@ static inline unsigned long get_tod_clock_monotonic(void)
|
||||
unsigned long tod;
|
||||
|
||||
preempt_disable_notrace();
|
||||
tod = get_tod_clock() - tod_clock_base.tod;
|
||||
tod = __get_tod_clock_monotonic();
|
||||
preempt_enable_notrace();
|
||||
return tod;
|
||||
}
|
||||
@@ -240,7 +245,7 @@ static inline unsigned long get_tod_clock_monotonic(void)
|
||||
* -> ns = (th * 125) + ((tl * 125) >> 9);
|
||||
*
|
||||
*/
|
||||
static inline unsigned long tod_to_ns(unsigned long todval)
|
||||
static __always_inline unsigned long tod_to_ns(unsigned long todval)
|
||||
{
|
||||
return ((todval >> 9) * 125) + (((todval & 0x1ff) * 125) >> 9);
|
||||
}
|
||||
|
||||
@@ -102,6 +102,11 @@ void __init time_early_init(void)
|
||||
((long) qui.old_leap * 4096000000L);
|
||||
}
|
||||
|
||||
unsigned long long noinstr sched_clock_noinstr(void)
|
||||
{
|
||||
return tod_to_ns(__get_tod_clock_monotonic());
|
||||
}
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user