From: tip-bot for Yuyang Du <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: duyuyang@gmail.com, torvalds@linux-foundation.org,
linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@kernel.org,
peterz@infradead.org, tglx@linutronix.de
Subject: [tip:locking/core] locking/lockdep: Add description and explanation in lockdep design doc
Date: Mon, 3 Jun 2019 06:07:07 -0700 [thread overview]
Message-ID: <tip-c01fbbc83f42748b3ed094497933601e6c9e0a03@git.kernel.org> (raw)
In-Reply-To: <20190506081939.74287-3-duyuyang@gmail.com>
Commit-ID: c01fbbc83f42748b3ed094497933601e6c9e0a03
Gitweb: https://git.kernel.org/tip/c01fbbc83f42748b3ed094497933601e6c9e0a03
Author: Yuyang Du <duyuyang@gmail.com>
AuthorDate: Mon, 6 May 2019 16:19:18 +0800
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Mon, 3 Jun 2019 11:55:34 +0200
locking/lockdep: Add description and explanation in lockdep design doc
More words are added to lockdep design document regarding key concepts,
which should help people without lockdep experience read and understand
lockdep reports.
Signed-off-by: Yuyang Du <duyuyang@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: bvanassche@acm.org
Cc: frederic@kernel.org
Cc: ming.lei@redhat.com
Cc: will.deacon@arm.com
Link: https://lkml.kernel.org/r/20190506081939.74287-3-duyuyang@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
Documentation/locking/lockdep-design.txt | 79 ++++++++++++++++++++++++--------
1 file changed, 61 insertions(+), 18 deletions(-)
diff --git a/Documentation/locking/lockdep-design.txt b/Documentation/locking/lockdep-design.txt
index 39fae143c9cb..ae65758383ea 100644
--- a/Documentation/locking/lockdep-design.txt
+++ b/Documentation/locking/lockdep-design.txt
@@ -15,34 +15,48 @@ tens of thousands of) instantiations. For example a lock in the inode
struct is one class, while each inode has its own instantiation of that
lock class.
-The validator tracks the 'state' of lock-classes, and it tracks
-dependencies between different lock-classes. The validator maintains a
-rolling proof that the state and the dependencies are correct.
-
-Unlike an lock instantiation, the lock-class itself never goes away: when
-a lock-class is used for the first time after bootup it gets registered,
-and all subsequent uses of that lock-class will be attached to this
-lock-class.
+The validator tracks the 'usage state' of lock-classes, and it tracks
+the dependencies between different lock-classes. Lock usage indicates
+how a lock is used with regard to its IRQ contexts, while lock
+dependency can be understood as lock order, where L1 -> L2 suggests that
+a task is attempting to acquire L2 while holding L1. From lockdep's
+perspective, the two locks (L1 and L2) are not necessarily related; that
+dependency just means the order ever happened. The validator maintains a
+continuing effort to prove lock usages and dependencies are correct or
+the validator will shoot a splat if incorrect.
+
+A lock-class's behavior is constructed by its instances collectively:
+when the first instance of a lock-class is used after bootup the class
+gets registered, then all (subsequent) instances will be mapped to the
+class and hence their usages and dependecies will contribute to those of
+the class. A lock-class does not go away when a lock instance does, but
+it can be removed if the memory space of the lock class (static or
+dynamic) is reclaimed, this happens for example when a module is
+unloaded or a workqueue is destroyed.
State
-----
-The validator tracks lock-class usage history into 4 * nSTATEs + 1 separate
-state bits:
+The validator tracks lock-class usage history and divides the usage into
+(4 usages * n STATEs + 1) categories:
+where the 4 usages can be:
- 'ever held in STATE context'
- 'ever held as readlock in STATE context'
- 'ever held with STATE enabled'
- 'ever held as readlock with STATE enabled'
-Where STATE can be either one of (kernel/locking/lockdep_states.h)
- - hardirq
- - softirq
+where the n STATEs are coded in kernel/locking/lockdep_states.h and as of
+now they include:
+- hardirq
+- softirq
+where the last 1 category is:
- 'ever used' [ == !unused ]
-When locking rules are violated, these state bits are presented in the
-locking error messages, inside curlies. A contrived example:
+When locking rules are violated, these usage bits are presented in the
+locking error messages, inside curlies, with a total of 2 * n STATEs bits.
+A contrived example:
modprobe/2287 is trying to acquire lock:
(&sio_locks[i].lock){-.-.}, at: [<c02867fd>] mutex_lock+0x21/0x24
@@ -51,15 +65,44 @@ locking error messages, inside curlies. A contrived example:
(&sio_locks[i].lock){-.-.}, at: [<c02867fd>] mutex_lock+0x21/0x24
-The bit position indicates STATE, STATE-read, for each of the states listed
-above, and the character displayed in each indicates:
+For a given lock, the bit positions from left to right indicate the usage
+of the lock and readlock (if exists), for each of the n STATEs listed
+above respectively, and the character displayed at each bit position
+indicates:
'.' acquired while irqs disabled and not in irq context
'-' acquired in irq context
'+' acquired with irqs enabled
'?' acquired in irq context with irqs enabled.
-Unused mutexes cannot be part of the cause of an error.
+The bits are illustrated with an example:
+
+ (&sio_locks[i].lock){-.-.}, at: [<c02867fd>] mutex_lock+0x21/0x24
+ ||||
+ ||| \-> softirq disabled and not in softirq context
+ || \--> acquired in softirq context
+ | \---> hardirq disabled and not in hardirq context
+ \----> acquired in hardirq context
+
+
+For a given STATE, whether the lock is ever acquired in that STATE
+context and whether that STATE is enabled yields four possible cases as
+shown in the table below. The bit character is able to indicate which
+exact case is for the lock as of the reporting time.
+
+ -------------------------------------------
+ | | irq enabled | irq disabled |
+ |-------------------------------------------|
+ | ever in irq | ? | - |
+ |-------------------------------------------|
+ | never in irq | + | . |
+ -------------------------------------------
+
+The character '-' suggests irq is disabled because if otherwise the
+charactor '?' would have been shown instead. Similar deduction can be
+applied for '+' too.
+
+Unused locks (e.g., mutexes) cannot be part of the cause of an error.
Single-lock state rules:
next prev parent reply other threads:[~2019-06-03 13:07 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-06 8:19 [PATCH v2 00/23] locking/lockdep: Small improvements Yuyang Du
2019-05-06 8:19 ` [PATCH v2 01/23] locking/lockdep: Change all print_*() return type to void Yuyang Du
2019-06-03 13:06 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 02/23] locking/lockdep: Add description and explanation in lockdep design doc Yuyang Du
2019-06-03 13:07 ` tip-bot for Yuyang Du [this message]
2019-05-06 8:19 ` [PATCH v2 03/23] locking/lockdep: Adjust lock usage bit character checks Yuyang Du
2019-06-03 13:07 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 04/23] locking/lockdep: Remove useless conditional macro Yuyang Du
2019-06-03 13:08 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 05/23] locking/lockdep: Print the right depth for chain key colission Yuyang Du
2019-06-03 13:09 ` [tip:locking/core] locking/lockdep: Print the right depth for chain key collision tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 06/23] locking/lockdep: Update obsolete struct field description Yuyang Du
2019-06-03 13:09 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 07/23] locking/lockdep: Use lockdep_init_task for task initiation consistently Yuyang Du
2019-06-03 13:10 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 08/23] locking/lockdep: Define INITIAL_CHAIN_KEY for chain keys to start with Yuyang Du
2019-06-03 13:11 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 09/23] locking/lockdep: Change the range of class_idx in held_lock struct Yuyang Du
2019-06-03 13:12 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 10/23] locking/lockdep: Remove unused argument in validate_chain() and check_deadlock() Yuyang Du
2019-06-03 13:12 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 11/23] locking/lockdep: Update comment Yuyang Du
2019-06-03 13:13 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 12/23] locking/lockdep: Change type of the element field in circular_queue Yuyang Du
2019-06-03 13:14 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 13/23] locking/lockdep: Change the return type of __cq_dequeue() Yuyang Du
2019-06-03 13:15 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 14/23] locking/lockdep: Avoid constant checks in __bfs by using offset reference Yuyang Du
2019-06-03 13:15 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 15/23] locking/lockdep: Update comments on dependency search Yuyang Du
2019-06-03 13:16 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 16/23] locking/lockdep: Add explanation to lock usage rules in lockdep design doc Yuyang Du
2019-06-03 13:17 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 17/23] locking/lockdep: Remove redundant argument in check_deadlock Yuyang Du
2019-06-03 13:18 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 18/23] locking/lockdep: Remove unused argument in __lock_release Yuyang Du
2019-06-03 13:18 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 19/23] locking/lockdep: Refactorize check_noncircular and check_redundant Yuyang Du
2019-06-03 13:19 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 20/23] locking/lockdep: Check redundant dependency only when CONFIG_LOCKDEP_SMALL Yuyang Du
2019-06-03 13:20 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 21/23] locking/lockdep: Consolidate lock usage bit initialization Yuyang Du
2019-06-03 13:20 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 22/23] locking/lockdep: Adjust new bit cases in mark_lock Yuyang Du
2019-06-03 13:21 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-06 8:19 ` [PATCH v2 23/23] locking/lockdep: Remove !dir in lock irq usage check Yuyang Du
2019-06-03 13:22 ` [tip:locking/core] " tip-bot for Yuyang Du
2019-05-08 8:55 ` [PATCH v2 00/23] locking/lockdep: Small improvements Peter Zijlstra
2019-05-09 0:50 ` Yuyang Du
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-c01fbbc83f42748b3ed094497933601e6c9e0a03@git.kernel.org \
--to=tipbot@zytor.com \
--cc=duyuyang@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox