hrtimer: Make the hrtimer_cpu_base::hres_active field unconditional, to simplify the code

The hrtimer_cpu_base::hres_active_member field depends on CONFIG_HIGH_RES_TIMERS=y
currently, and all related functions to this member are conditional as well.

To simplify the code make it unconditional and set it to zero during initialization.

(This will also help with the upcoming softirq based hrtimers code.)

The conditional code sections can be avoided by adding IS_ENABLED(HIGHRES)
conditionals into common functions, which ensures dead code elimination.

There is no functional change.

Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Cc: Christoph Hellwig <hch@lst.de>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: keescook@chromium.org
Link: http://lkml.kernel.org/r/20171221104205.7269-14-anna-maria@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Anna-Maria Gleixner 2017-12-21 11:41:42 +01:00 committed by Ingo Molnar
parent da21c5a58a
commit 28bfd18bf3
2 changed files with 23 additions and 28 deletions

View File

@ -161,8 +161,8 @@ enum hrtimer_base_type {
* @cpu: cpu number * @cpu: cpu number
* @active_bases: Bitfield to mark bases with active timers * @active_bases: Bitfield to mark bases with active timers
* @clock_was_set_seq: Sequence counter of clock was set events * @clock_was_set_seq: Sequence counter of clock was set events
* @in_hrtirq: hrtimer_interrupt() is currently executing
* @hres_active: State of high resolution mode * @hres_active: State of high resolution mode
* @in_hrtirq: hrtimer_interrupt() is currently executing
* @hang_detected: The last hrtimer interrupt detected a hang * @hang_detected: The last hrtimer interrupt detected a hang
* @expires_next: absolute time of the next event, is required for remote * @expires_next: absolute time of the next event, is required for remote
* hrtimer enqueue * hrtimer enqueue
@ -182,9 +182,9 @@ struct hrtimer_cpu_base {
unsigned int cpu; unsigned int cpu;
unsigned int active_bases; unsigned int active_bases;
unsigned int clock_was_set_seq; unsigned int clock_was_set_seq;
unsigned int hres_active : 1;
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
unsigned int in_hrtirq : 1, unsigned int in_hrtirq : 1,
hres_active : 1,
hang_detected : 1; hang_detected : 1;
ktime_t expires_next; ktime_t expires_next;
struct hrtimer *next_timer; struct hrtimer *next_timer;
@ -266,16 +266,17 @@ static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
return timer->base->get_time(); return timer->base->get_time();
} }
static inline int hrtimer_is_hres_active(struct hrtimer *timer)
{
return IS_ENABLED(CONFIG_HIGH_RES_TIMERS) ?
timer->base->cpu_base->hres_active : 0;
}
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
struct clock_event_device; struct clock_event_device;
extern void hrtimer_interrupt(struct clock_event_device *dev); extern void hrtimer_interrupt(struct clock_event_device *dev);
static inline int hrtimer_is_hres_active(struct hrtimer *timer)
{
return timer->base->cpu_base->hres_active;
}
/* /*
* The resolution of the clocks. The resolution value is returned in * The resolution of the clocks. The resolution value is returned in
* the clock_getres() system call to give application programmers an * the clock_getres() system call to give application programmers an
@ -298,11 +299,6 @@ extern unsigned int hrtimer_resolution;
#define hrtimer_resolution (unsigned int)LOW_RES_NSEC #define hrtimer_resolution (unsigned int)LOW_RES_NSEC
static inline int hrtimer_is_hres_active(struct hrtimer *timer)
{
return 0;
}
static inline void clock_was_set_delayed(void) { } static inline void clock_was_set_delayed(void) { }
#endif #endif

View File

@ -512,6 +512,20 @@ static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base)
offs_real, offs_boot, offs_tai); offs_real, offs_boot, offs_tai);
} }
/*
* Is the high resolution mode active ?
*/
static inline int __hrtimer_hres_active(struct hrtimer_cpu_base *cpu_base)
{
return IS_ENABLED(CONFIG_HIGH_RES_TIMERS) ?
cpu_base->hres_active : 0;
}
static inline int hrtimer_hres_active(void)
{
return __hrtimer_hres_active(this_cpu_ptr(&hrtimer_bases));
}
/* High resolution timer related functions */ /* High resolution timer related functions */
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
@ -540,19 +554,6 @@ static inline int hrtimer_is_hres_enabled(void)
return hrtimer_hres_enabled; return hrtimer_hres_enabled;
} }
/*
* Is the high resolution mode active ?
*/
static inline int __hrtimer_hres_active(struct hrtimer_cpu_base *cpu_base)
{
return cpu_base->hres_active;
}
static inline int hrtimer_hres_active(void)
{
return __hrtimer_hres_active(this_cpu_ptr(&hrtimer_bases));
}
/* /*
* Reprogram the event source with checking both queues for the * Reprogram the event source with checking both queues for the
* next event * next event
@ -661,7 +662,6 @@ static void hrtimer_reprogram(struct hrtimer *timer,
static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base) static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base)
{ {
base->expires_next = KTIME_MAX; base->expires_next = KTIME_MAX;
base->hres_active = 0;
} }
/* /*
@ -720,8 +720,6 @@ void clock_was_set_delayed(void)
#else #else
static inline int __hrtimer_hres_active(struct hrtimer_cpu_base *b) { return 0; }
static inline int hrtimer_hres_active(void) { return 0; }
static inline int hrtimer_is_hres_enabled(void) { return 0; } static inline int hrtimer_is_hres_enabled(void) { return 0; }
static inline void hrtimer_switch_to_hres(void) { } static inline void hrtimer_switch_to_hres(void) { }
static inline void static inline void
@ -1600,6 +1598,7 @@ int hrtimers_prepare_cpu(unsigned int cpu)
} }
cpu_base->cpu = cpu; cpu_base->cpu = cpu;
cpu_base->hres_active = 0;
hrtimer_init_hres(cpu_base); hrtimer_init_hres(cpu_base);
return 0; return 0;
} }