mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:27:35 +00:00
Kernel/Locking: Add lock rank tracking per thread to find deadlocks
This change adds a static lock hierarchy / ranking to the Kernel with the goal of reducing / finding deadlocks when running with SMP enabled. We have seen quite a few lock ordering deadlocks (locks taken in a different order, on two different code paths). As we properly annotate locks in the system, then these facilities will find these locking protocol violations automatically The `LockRank` enum documents the various locks in the system and their rank. The implementation guarantees that a thread holding one or more locks of a lower rank cannot acquire an additional lock with rank that is greater or equal to any of the currently held locks.
This commit is contained in:
parent
0718afa773
commit
066b0590ec
5 changed files with 128 additions and 0 deletions
29
Kernel/Locking/LockRank.cpp
Normal file
29
Kernel/Locking/LockRank.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/Locking/LockRank.h>
|
||||
#include <Kernel/Thread.h>
|
||||
|
||||
// Note: These stubs can't be in LockRank.h as that would create
|
||||
// a cyclic dependency in the header include graph of the Kernel.
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
void track_lock_acquire(LockRank rank)
|
||||
{
|
||||
auto thread = Thread::current();
|
||||
if (thread && !thread->is_crashing())
|
||||
thread->track_lock_acquire(rank);
|
||||
}
|
||||
|
||||
void track_lock_release(LockRank rank)
|
||||
{
|
||||
auto thread = Thread::current();
|
||||
if (thread && !thread->is_crashing())
|
||||
thread->track_lock_release(rank);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue