Skip to content

Commit

Permalink
locking/mutex: Clarify that mutex_unlock(), and most other sleeping l…
Browse files Browse the repository at this point in the history
…ocks, can still use the lock object after it's unlocked

Clarify the mutex lock lifetime rules a bit more.

Signed-off-by: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Jann Horn <[email protected]>
Cc: Linus Torvalds <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
Ingo Molnar committed Jan 8, 2024
1 parent 67a1723 commit 2b9d9e0
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions Documentation/locking/mutex-design.rst
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,24 @@ features that make lock debugging easier and faster:
- Detects multi-task circular deadlocks and prints out all affected
locks and tasks (and only those tasks).

Releasing a mutex is not an atomic operation: Once a mutex release operation
has begun, another context may be able to acquire the mutex before the release
operation has fully completed. The mutex user must ensure that the mutex is not
destroyed while a release operation is still in progress - in other words,
callers of mutex_unlock() must ensure that the mutex stays alive until
mutex_unlock() has returned.
Mutexes - and most other sleeping locks like rwsems - do not provide an
implicit reference for the memory they occupy, which reference is released
with mutex_unlock().

[ This is in contrast with spin_unlock() [or completion_done()], which
APIs can be used to guarantee that the memory is not touched by the
lock implementation after spin_unlock()/completion_done() releases
the lock. ]

mutex_unlock() may access the mutex structure even after it has internally
released the lock already - so it's not safe for another context to
acquire the mutex and assume that the mutex_unlock() context is not using
the structure anymore.

The mutex user must ensure that the mutex is not destroyed while a
release operation is still in progress - in other words, callers of
mutex_unlock() must ensure that the mutex stays alive until mutex_unlock()
has returned.

Interfaces
----------
Expand Down

0 comments on commit 2b9d9e0

Please sign in to comment.