lkml.org 
[lkml]   [2020]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: locking/core] hrtimer: Use sequence counter with associated raw spinlock
    The following commit has been merged into the locking/core branch of tip:

    Commit-ID: af5a06b582ec3d7b0160b4faaa65f73d8dcf989f
    Gitweb: https://git.kernel.org/tip/af5a06b582ec3d7b0160b4faaa65f73d8dcf989f
    Author: Ahmed S. Darwish <a.darwish@linutronix.de>
    AuthorDate: Mon, 20 Jul 2020 17:55:30 +02:00
    Committer: Peter Zijlstra <peterz@infradead.org>
    CommitterDate: Wed, 29 Jul 2020 16:14:29 +02:00

    hrtimer: Use sequence counter with associated raw spinlock

    A sequence counter write side critical section must be protected by some
    form of locking to serialize writers. A plain seqcount_t does not
    contain the information of which lock must be held when entering a write
    side critical section.

    Use the new seqcount_raw_spinlock_t data type, which allows to associate
    a raw spinlock with the sequence counter. This enables lockdep to verify
    that the raw spinlock used for writer serialization is held when the
    write side critical section is entered.

    If lockdep is disabled this lock association is compiled out and has
    neither storage size nor runtime overhead.

    Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200720155530.1173732-25-a.darwish@linutronix.de
    ---
    include/linux/hrtimer.h | 2 +-
    kernel/time/hrtimer.c | 13 ++++++++++---
    2 files changed, 11 insertions(+), 4 deletions(-)

    diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
    index 15c8ac3..25993b8 100644
    --- a/include/linux/hrtimer.h
    +++ b/include/linux/hrtimer.h
    @@ -159,7 +159,7 @@ struct hrtimer_clock_base {
    struct hrtimer_cpu_base *cpu_base;
    unsigned int index;
    clockid_t clockid;
    - seqcount_t seq;
    + seqcount_raw_spinlock_t seq;
    struct hrtimer *running;
    struct timerqueue_head active;
    ktime_t (*get_time)(void);
    diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
    index d89da1c..c403851 100644
    --- a/kernel/time/hrtimer.c
    +++ b/kernel/time/hrtimer.c
    @@ -135,7 +135,11 @@ static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {
    * timer->base->cpu_base
    */
    static struct hrtimer_cpu_base migration_cpu_base = {
    - .clock_base = { { .cpu_base = &migration_cpu_base, }, },
    + .clock_base = { {
    + .cpu_base = &migration_cpu_base,
    + .seq = SEQCNT_RAW_SPINLOCK_ZERO(migration_cpu_base.seq,
    + &migration_cpu_base.lock),
    + }, },
    };

    #define migration_base migration_cpu_base.clock_base[0]
    @@ -1998,8 +2002,11 @@ int hrtimers_prepare_cpu(unsigned int cpu)
    int i;

    for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
    - cpu_base->clock_base[i].cpu_base = cpu_base;
    - timerqueue_init_head(&cpu_base->clock_base[i].active);
    + struct hrtimer_clock_base *clock_b = &cpu_base->clock_base[i];
    +
    + clock_b->cpu_base = cpu_base;
    + seqcount_raw_spinlock_init(&clock_b->seq, &cpu_base->lock);
    + timerqueue_init_head(&clock_b->active);
    }

    cpu_base->cpu = cpu;
    \
     
     \ /
      Last update: 2020-07-29 16:36    [W:4.515 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site