lkml.org 
[lkml]   [2017]   [Oct]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 16/37] hrtimer: Make hrtimer_cpu_base.next_timer handling unconditional
    hrtimer_cpu_base.next_timer stores the pointer to the next expiring timer
    in a cpu base.

    This pointer cannot be dereferenced and is solely used to check whether a
    hrtimer which is removed is the hrtimer which is the first to expire in the
    CPU base. If this is the case, then the timer hardware needs to be
    reprogrammed to avoid an extra interrupt for nothing.

    Again, this is conditional functionality, but there is no compelling reason
    to make this conditional. As a preparation, hrtimer_cpu_base.next_timer
    needs to be available unconditonal. Aside of that the upcoming support for
    softirq based hrtimers requires access to this pointer unconditionally.

    Make the update of hrtimer_cpu_base.next_timer unconditional and remove the
    ifdef cruft. The impact on CONFIG_HIGH_RES_TIMERS=n && CONFIG_NOHZ=n is
    marginal as it's just a store on an already dirtied cacheline.

    No functional change.

    Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
    ---
    include/linux/hrtimer.h | 4 ++--
    kernel/time/hrtimer.c | 12 ++----------
    2 files changed, 4 insertions(+), 12 deletions(-)

    --- a/include/linux/hrtimer.h
    +++ b/include/linux/hrtimer.h
    @@ -166,13 +166,13 @@ enum hrtimer_base_type {
    * @in_hrtirq: hrtimer_interrupt() is currently executing
    * @hres_active: State of high resolution mode
    * @hang_detected: The last hrtimer interrupt detected a hang
    - * @next_timer: Pointer to the first expiring timer
    * @nr_events: Total number of hrtimer interrupt events
    * @nr_retries: Total number of hrtimer interrupt retries
    * @nr_hangs: Total number of hrtimer interrupt hangs
    * @max_hang_time: Maximum time spent in hrtimer_interrupt
    * @expires_next: absolute time of the next event, is required for remote
    * hrtimer enqueue
    + * @next_timer: Pointer to the first expiring timer
    * @clock_base: array of clock bases for this cpu
    *
    * Note: next_timer is just an optimization for __remove_hrtimer().
    @@ -190,13 +190,13 @@ struct hrtimer_cpu_base {
    #ifdef CONFIG_HIGH_RES_TIMERS
    unsigned int in_hrtirq : 1,
    hang_detected : 1;
    - struct hrtimer *next_timer;
    unsigned int nr_events;
    unsigned short nr_retries;
    unsigned short nr_hangs;
    unsigned int max_hang_time;
    #endif
    ktime_t expires_next;
    + struct hrtimer *next_timer;
    struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES];
    } ____cacheline_aligned;

    --- a/kernel/time/hrtimer.c
    +++ b/kernel/time/hrtimer.c
    @@ -449,14 +449,6 @@ static inline void debug_deactivate(stru
    }

    #if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)
    -static inline void hrtimer_update_next_timer(struct hrtimer_cpu_base *cpu_base,
    - struct hrtimer *timer)
    -{
    -#ifdef CONFIG_HIGH_RES_TIMERS
    - cpu_base->next_timer = timer;
    -#endif
    -}
    -
    static struct hrtimer_clock_base *
    __next_base(struct hrtimer_cpu_base *cpu_base, unsigned int *active)
    {
    @@ -480,7 +472,7 @@ static ktime_t __hrtimer_get_next_event(
    unsigned int active = cpu_base->active_bases;
    ktime_t expires, expires_next = KTIME_MAX;

    - hrtimer_update_next_timer(cpu_base, NULL);
    + cpu_base->next_timer = NULL;
    for_each_active_base(base, cpu_base, active) {
    struct timerqueue_node *next;
    struct hrtimer *timer;
    @@ -490,7 +482,7 @@ static ktime_t __hrtimer_get_next_event(
    expires = ktime_sub(hrtimer_get_expires(timer), base->offset);
    if (expires < expires_next) {
    expires_next = expires;
    - hrtimer_update_next_timer(cpu_base, timer);
    + cpu_base->next_timer = timer;
    }
    }
    /*

    \
     
     \ /
      Last update: 2017-10-22 23:49    [W:3.447 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site