NOHZ: unify the nohz function calls in irq_enter()
We have two separate nohz function calls in irq_enter() for no good reason. Just call a single NOHZ function from irq_enter() and call the bits in the tick code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
2e532d68a2
commit
719254faa1
@ -96,9 +96,11 @@ extern cpumask_t *tick_get_broadcast_oneshot_mask(void);
|
|||||||
extern void tick_clock_notify(void);
|
extern void tick_clock_notify(void);
|
||||||
extern int tick_check_oneshot_change(int allow_nohz);
|
extern int tick_check_oneshot_change(int allow_nohz);
|
||||||
extern struct tick_sched *tick_get_tick_sched(int cpu);
|
extern struct tick_sched *tick_get_tick_sched(int cpu);
|
||||||
|
extern void tick_check_idle(int cpu);
|
||||||
# else
|
# else
|
||||||
static inline void tick_clock_notify(void) { }
|
static inline void tick_clock_notify(void) { }
|
||||||
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
|
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
|
||||||
|
static inline void tick_check_idle(int cpu) { }
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#else /* CONFIG_GENERIC_CLOCKEVENTS */
|
#else /* CONFIG_GENERIC_CLOCKEVENTS */
|
||||||
@ -106,26 +108,23 @@ static inline void tick_init(void) { }
|
|||||||
static inline void tick_cancel_sched_timer(int cpu) { }
|
static inline void tick_cancel_sched_timer(int cpu) { }
|
||||||
static inline void tick_clock_notify(void) { }
|
static inline void tick_clock_notify(void) { }
|
||||||
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
|
static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
|
||||||
|
static inline void tick_check_idle(int cpu) { }
|
||||||
#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
|
#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
|
||||||
|
|
||||||
# ifdef CONFIG_NO_HZ
|
# ifdef CONFIG_NO_HZ
|
||||||
extern void tick_nohz_stop_sched_tick(int inidle);
|
extern void tick_nohz_stop_sched_tick(int inidle);
|
||||||
extern void tick_nohz_restart_sched_tick(void);
|
extern void tick_nohz_restart_sched_tick(void);
|
||||||
extern void tick_nohz_update_jiffies(void);
|
|
||||||
extern ktime_t tick_nohz_get_sleep_length(void);
|
extern ktime_t tick_nohz_get_sleep_length(void);
|
||||||
extern void tick_nohz_stop_idle(int cpu);
|
|
||||||
extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
|
extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
|
||||||
# else
|
# else
|
||||||
static inline void tick_nohz_stop_sched_tick(int inidle) { }
|
static inline void tick_nohz_stop_sched_tick(int inidle) { }
|
||||||
static inline void tick_nohz_restart_sched_tick(void) { }
|
static inline void tick_nohz_restart_sched_tick(void) { }
|
||||||
static inline void tick_nohz_update_jiffies(void) { }
|
|
||||||
static inline ktime_t tick_nohz_get_sleep_length(void)
|
static inline ktime_t tick_nohz_get_sleep_length(void)
|
||||||
{
|
{
|
||||||
ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
|
ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
static inline void tick_nohz_stop_idle(int cpu) { }
|
|
||||||
static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
|
static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
|
||||||
# endif /* !NO_HZ */
|
# endif /* !NO_HZ */
|
||||||
|
|
||||||
|
@ -265,16 +265,12 @@ asmlinkage void do_softirq(void)
|
|||||||
*/
|
*/
|
||||||
void irq_enter(void)
|
void irq_enter(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_NO_HZ
|
|
||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
|
|
||||||
if (idle_cpu(cpu) && !in_interrupt())
|
if (idle_cpu(cpu) && !in_interrupt())
|
||||||
tick_nohz_stop_idle(cpu);
|
tick_check_idle(cpu);
|
||||||
#endif
|
|
||||||
__irq_enter();
|
__irq_enter();
|
||||||
#ifdef CONFIG_NO_HZ
|
|
||||||
if (idle_cpu(cpu))
|
|
||||||
tick_nohz_update_jiffies();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
|
#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
|
||||||
|
@ -155,7 +155,7 @@ void tick_nohz_update_jiffies(void)
|
|||||||
touch_softlockup_watchdog();
|
touch_softlockup_watchdog();
|
||||||
}
|
}
|
||||||
|
|
||||||
void tick_nohz_stop_idle(int cpu)
|
static void tick_nohz_stop_idle(int cpu)
|
||||||
{
|
{
|
||||||
struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
|
struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
|
||||||
|
|
||||||
@ -558,6 +558,17 @@ static inline void tick_nohz_switch_to_nohz(void) { }
|
|||||||
|
|
||||||
#endif /* NO_HZ */
|
#endif /* NO_HZ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called from irq_enter to notify about the possible interruption of idle()
|
||||||
|
*/
|
||||||
|
void tick_check_idle(int cpu)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_NO_HZ
|
||||||
|
tick_nohz_stop_idle(cpu);
|
||||||
|
tick_nohz_update_jiffies();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* High resolution timer specific code
|
* High resolution timer specific code
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user