lockdep: Avoid to modify chain keys in validate_chain()
authorBoqun Feng <boqun.feng@gmail.com>
Mon, 2 Nov 2020 05:37:41 +0000 (13:37 +0800)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 10 Nov 2020 17:38:38 +0000 (18:38 +0100)
commitd61fc96a37603384cd531622c1e89de1096b5123
tree5d490e5ac875caf6a9bae5146b91dd3140df37ca
parent1e106aa3509b86738769775969822ffc1ec21bf4
lockdep: Avoid to modify chain keys in validate_chain()

Chris Wilson reported a problem spotted by check_chain_key(): a chain
key got changed in validate_chain() because we modify the ->read in
validate_chain() to skip checks for dependency adding, and ->read is
taken into calculation for chain key since commit f611e8cf98ec
("lockdep: Take read/write status in consideration when generate
chainkey").

Fix this by avoiding to modify ->read in validate_chain() based on two
facts: a) since we now support recursive read lock detection, there is
no need to skip checks for dependency adding for recursive readers, b)
since we have a), there is only one case left (nest_lock) where we want
to skip checks in validate_chain(), we simply remove the modification
for ->read and rely on the return value of check_deadlock() to skip the
dependency adding.

Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20201102053743.450459-1-boqun.feng@gmail.com
kernel/locking/lockdep.c