#ifdef CONFIG_NO_HZ_COMMON
extern unsigned long tick_nohz_active;
extern void timers_update_nohz(void);
+extern u64 get_jiffies_update(unsigned long *basej);
# ifdef CONFIG_SMP
extern struct static_key_false timers_migration_enabled;
extern void fetch_next_timer_interrupt_remote(unsigned long basej, u64 basem,
return local_softirq_pending() & BIT(TIMER_SOFTIRQ);
}
+/*
+ * Read jiffies and the time when jiffies were updated last
+ */
+u64 get_jiffies_update(unsigned long *basej)
+{
+ unsigned long basejiff;
+ unsigned int seq;
+ u64 basemono;
+
+ do {
+ seq = read_seqcount_begin(&jiffies_seq);
+ basemono = last_jiffies_update;
+ basejiff = jiffies;
+ } while (read_seqcount_retry(&jiffies_seq, seq));
+ *basej = basejiff;
+ return basemono;
+}
+
/**
* tick_nohz_next_event() - return the clock monotonic based next event
* @ts: pointer to tick_sched struct
{
u64 basemono, next_tick, delta, expires;
unsigned long basejiff;
- unsigned int seq;
- /* Read jiffies and the time when jiffies were updated last */
- do {
- seq = read_seqcount_begin(&jiffies_seq);
- basemono = last_jiffies_update;
- basejiff = jiffies;
- } while (read_seqcount_retry(&jiffies_seq, seq));
+ basemono = get_jiffies_update(&basejiff);
ts->last_jiffies = basejiff;
ts->timer_expires_base = basemono;