lkml.org 
[lkml]   [2017]   [Dec]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 27/36] hrtimer: Prepare handling of hard and softirq based hrtimers
    Date
    The softirq based hrtimer can utilize most of the existing hrtimers
    functions, but need to operate on a different data set.

    Add an active_mask argument to various functions so the hard and soft bases
    can be selected. Fixup the existing callers and hand in the ACTIVE_HARD
    mask.

    Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
    ---
    kernel/time/hrtimer.c | 38 +++++++++++++++++++++++++++++---------
    1 file changed, 29 insertions(+), 9 deletions(-)

    diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
    index 74598e3da748..66af33ad2935 100644
    --- a/kernel/time/hrtimer.c
    +++ b/kernel/time/hrtimer.c
    @@ -60,6 +60,15 @@
    #include "tick-internal.h"

    /*
    + * Masks for selecting the soft and hard context timers from
    + * cpu_base->active
    + */
    +#define MASK_SHIFT (HRTIMER_BASE_MONOTONIC_SOFT)
    +#define HRTIMER_ACTIVE_HARD ((1U << MASK_SHIFT) - 1)
    +#define HRTIMER_ACTIVE_SOFT (HRTIMER_ACTIVE_HARD << MASK_SHIFT)
    +#define HRTIMER_ACTIVE_ALL (HRTIMER_ACTIVE_SOFT | HRTIMER_ACTIVE_HARD)
    +
    +/*
    * The timer bases:
    *
    * There are more clockids than hrtimer bases. Thus, we index
    @@ -508,13 +517,24 @@ static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base,
    return expires_next;
    }

    -static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base)
    +/*
    + * Recomputes cpu_base::*next_timer and returns the earliest expires_next but
    + * does not set cpu_base::*expires_next, that is done by hrtimer_reprogram.
    + *
    + * @active_mask must be one of:
    + * - HRTIMER_ACTIVE,
    + * - HRTIMER_ACTIVE_SOFT, or
    + * - HRTIMER_ACTIVE_HARD.
    + */
    +static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base,
    + unsigned int active_mask)
    {
    - unsigned int active = cpu_base->active_bases;
    + unsigned int active;
    ktime_t expires_next = KTIME_MAX;

    cpu_base->next_timer = NULL;

    + active = cpu_base->active_bases & active_mask;
    expires_next = __hrtimer_next_event_base(cpu_base, active, expires_next);

    return expires_next;
    @@ -555,7 +575,7 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal)
    {
    ktime_t expires_next;

    - expires_next = __hrtimer_get_next_event(cpu_base);
    + expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_HARD);

    if (skip_equal && expires_next == cpu_base->expires_next)
    return;
    @@ -1076,7 +1096,7 @@ u64 hrtimer_get_next_event(void)
    raw_spin_lock_irqsave(&cpu_base->lock, flags);

    if (!__hrtimer_hres_active(cpu_base))
    - expires = __hrtimer_get_next_event(cpu_base);
    + expires = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_HARD);

    raw_spin_unlock_irqrestore(&cpu_base->lock, flags);

    @@ -1250,10 +1270,10 @@ static void __run_hrtimer(struct hrtimer_cpu_base *cpu_base,
    }

    static void __hrtimer_run_queues(struct hrtimer_cpu_base *cpu_base, ktime_t now,
    - unsigned long flags)
    + unsigned long flags, unsigned int active_mask)
    {
    struct hrtimer_clock_base *base;
    - unsigned int active = cpu_base->active_bases;
    + unsigned int active = cpu_base->active_bases & active_mask;

    for_each_active_base(base, cpu_base, active) {
    struct timerqueue_node *node;
    @@ -1316,10 +1336,10 @@ void hrtimer_interrupt(struct clock_event_device *dev)
    */
    cpu_base->expires_next = KTIME_MAX;

    - __hrtimer_run_queues(cpu_base, now, flags);
    + __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD);

    /* Reevaluate the clock bases for the next expiry */
    - expires_next = __hrtimer_get_next_event(cpu_base);
    + expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_HARD);
    /*
    * Store the new expiry value so the migration code can verify
    * against it.
    @@ -1423,7 +1443,7 @@ void hrtimer_run_queues(void)

    raw_spin_lock_irqsave(&cpu_base->lock, flags);
    now = hrtimer_update_base(cpu_base);
    - __hrtimer_run_queues(cpu_base, now, flags);
    + __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD);
    raw_spin_unlock_irqrestore(&cpu_base->lock, flags);
    }

    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-21 11:51    [W:2.417 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site