mirror of
https://github.com/genodelabs/genode.git
synced 2025-03-21 03:25:34 +00:00
dde_linux: update jiffies in cpu_relax on x86/pc
This commit is contained in:
parent
e350dc27e9
commit
72bb960c2a
@ -23,7 +23,7 @@ static __always_inline void cpu_relax(void)
|
||||
* endless busy loops like:
|
||||
* - slchi() in drivers/i2c/algos/i2c-algo-bit.c
|
||||
*/
|
||||
if (!lx_emul_irq_state()) lx_emul_time_update_jiffies();
|
||||
if (!lx_emul_irq_state()) lx_emul_time_update_jiffies_cpu_relax();
|
||||
}
|
||||
|
||||
#endif /* _LX_EMUL__SHADOW__ARCH__X86__INCLUDE__ASM__VDSO__PROCESSOR_H_ */
|
||||
|
@ -32,6 +32,8 @@ void lx_emul_time_update_jiffies(void);
|
||||
|
||||
void lx_emul_time_initial(unsigned long long);
|
||||
|
||||
void lx_emul_time_update_jiffies_cpu_relax(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -134,6 +134,36 @@ void lx_emul_time_update_jiffies(void)
|
||||
}
|
||||
|
||||
|
||||
extern void update_wall_time(void);
|
||||
|
||||
|
||||
void lx_emul_time_update_jiffies_cpu_relax()
|
||||
{
|
||||
/* based upon tick_do_update_jiffies64 in kernel/time/tick-sched.c */
|
||||
|
||||
ktime_t delta, now = ktime_get();
|
||||
|
||||
/* check if jiffies need an update */
|
||||
if (ktime_before(now, tick_next_period))
|
||||
return;
|
||||
|
||||
delta = ktime_sub(now, tick_next_period);
|
||||
|
||||
if (unlikely(delta >= TICK_NSEC)) {
|
||||
/* Slow path for long idle sleep times */
|
||||
s64 incr = TICK_NSEC;
|
||||
|
||||
ktime_t ticks = ktime_divns(delta, incr);
|
||||
|
||||
jiffies_64 += ticks;
|
||||
|
||||
tick_next_period = ktime_add_ns(tick_next_period, incr * ticks);
|
||||
|
||||
update_wall_time();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
enum { LX_EMUL_MAX_OF_CLOCK_PROVIDERS = 256 };
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user