lkml.org 
[lkml]   [2019]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 137/158] locking/lockdep: Fix lock used or unused stats error
    Date
    [ Upstream commit 68d41d8c94a31dfb8233ab90b9baf41a2ed2da68 ]

    The stats variable nr_unused_locks is incremented every time a new lock
    class is register and decremented when the lock is first used in
    __lock_acquire(). And after all, it is shown and checked in lockdep_stats.

    However, under configurations that either CONFIG_TRACE_IRQFLAGS or
    CONFIG_PROVE_LOCKING is not defined:

    The commit:

    091806515124b20 ("locking/lockdep: Consolidate lock usage bit initialization")

    missed marking the LOCK_USED flag at IRQ usage initialization because
    as mark_usage() is not called. And the commit:

    886532aee3cd42d ("locking/lockdep: Move mark_lock() inside CONFIG_TRACE_IRQFLAGS && CONFIG_PROVE_LOCKING")

    further made mark_lock() not defined such that the LOCK_USED cannot be
    marked at all when the lock is first acquired.

    As a result, we fix this by not showing and checking the stats under such
    configurations for lockdep_stats.

    Reported-by: Qian Cai <cai@lca.pw>
    Signed-off-by: Yuyang Du <duyuyang@gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: arnd@arndb.de
    Cc: frederic@kernel.org
    Link: https://lkml.kernel.org/r/20190709101522.9117-1-duyuyang@gmail.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/locking/lockdep_proc.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c
    index dbb61a302548..9778b6701019 100644
    --- a/kernel/locking/lockdep_proc.c
    +++ b/kernel/locking/lockdep_proc.c
    @@ -227,6 +227,7 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
    nr_hardirq_read_safe = 0, nr_hardirq_read_unsafe = 0,
    sum_forward_deps = 0;

    +#ifdef CONFIG_PROVE_LOCKING
    list_for_each_entry(class, &all_lock_classes, lock_entry) {

    if (class->usage_mask == 0)
    @@ -258,12 +259,12 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
    if (class->usage_mask & LOCKF_ENABLED_HARDIRQ_READ)
    nr_hardirq_read_unsafe++;

    -#ifdef CONFIG_PROVE_LOCKING
    sum_forward_deps += lockdep_count_forward_deps(class);
    -#endif
    }
    #ifdef CONFIG_DEBUG_LOCKDEP
    DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused);
    +#endif
    +
    #endif
    seq_printf(m, " lock-classes: %11lu [max: %lu]\n",
    nr_lock_classes, MAX_LOCKDEP_KEYS);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-08-02 11:38    [W:4.076 / U:0.524 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site