lkml.org 
[lkml]   [2021]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/11] lockdep: Remove softirq accounting on PREEMPT_RT.
    Date
    From: Thomas Gleixner <tglx@linutronix.de>

    There is not really a softirq context on PREEMPT_RT.
    Softirqs on PREEMPT_RT are always invoked within the context of a
    threaded interrupt handler or within ksoftirqd. The "in-softirq" context
    is preemptible and is protected by a per-CPU lock to ensure mutual
    exclusion.

    There is no difference on PREEMPT_RT between spin_lock_irq() and
    spin_lock() because the former does not disable interrupts. Therefore if
    a lock is used in_softirq() and locked once with spin_lock_irq() then
    lockdep will report this with "inconsistent {SOFTIRQ-ON-W} ->
    {IN-SOFTIRQ-W} usage".

    Teach lockdep that we don't really do softirqs on -RT.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    include/linux/irqflags.h | 23 +++++++++++++++--------
    kernel/locking/lockdep.c | 2 ++
    2 files changed, 17 insertions(+), 8 deletions(-)

    diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h
    index 600c10da321a7..4b140938b03e2 100644
    --- a/include/linux/irqflags.h
    +++ b/include/linux/irqflags.h
    @@ -71,14 +71,6 @@ do { \
    do { \
    __this_cpu_dec(hardirq_context); \
    } while (0)
    -# define lockdep_softirq_enter() \
    -do { \
    - current->softirq_context++; \
    -} while (0)
    -# define lockdep_softirq_exit() \
    -do { \
    - current->softirq_context--; \
    -} while (0)

    # define lockdep_hrtimer_enter(__hrtimer) \
    ({ \
    @@ -140,6 +132,21 @@ do { \
    # define lockdep_irq_work_exit(__work) do { } while (0)
    #endif

    +#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT)
    +# define lockdep_softirq_enter() \
    +do { \
    + current->softirq_context++; \
    +} while (0)
    +# define lockdep_softirq_exit() \
    +do { \
    + current->softirq_context--; \
    +} while (0)
    +
    +#else
    +# define lockdep_softirq_enter() do { } while (0)
    +# define lockdep_softirq_exit() do { } while (0)
    +#endif
    +
    #if defined(CONFIG_IRQSOFF_TRACER) || \
    defined(CONFIG_PREEMPT_TRACER)
    extern void stop_critical_timings(void);
    diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
    index 2270ec68f10a1..4a882f83aeb9d 100644
    --- a/kernel/locking/lockdep.c
    +++ b/kernel/locking/lockdep.c
    @@ -5485,6 +5485,7 @@ static noinstr void check_flags(unsigned long flags)
    }
    }

    +#ifndef CONFIG_PREEMPT_RT
    /*
    * We dont accurately track softirq state in e.g.
    * hardirq contexts (such as on 4KSTACKS), so only
    @@ -5499,6 +5500,7 @@ static noinstr void check_flags(unsigned long flags)
    DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled);
    }
    }
    +#endif

    if (!debug_locks)
    print_irqtrace_events(current);
    --
    2.34.0
    \
     
     \ /
      Last update: 2021-11-29 23:32    [W:5.142 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site