locking/lockdep: Fix lock used or unused stats error [Linux 4.9.187]

This Linux kernel change "locking/lockdep: Fix lock used or unused stats error" is included in the Linux 4.9.187 release. This change is authored by Yuyang Du <duyuyang [at] gmail.com> on Tue Jul 9 18:15:22 2019 +0800. The commit for this change in Linux stable tree is ccaa280 (patch) which is from upstream commit 68d41d8. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 68d41d8.

locking/lockdep: Fix lock used or unused stats error

[ 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>

There are 5 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 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 a0f61ef..c482de6 100644
--- a/kernel/locking/lockdep_proc.c
+++ b/kernel/locking/lockdep_proc.c
@@ -229,6 +229,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)
@@ -260,13 +261,13 @@ 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);
    seq_printf(m, " direct dependencies:           %11lu [max: %lu]\n",

Leave a Reply

Your email address will not be published. Required fields are marked *