Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-block.git] / include / linux / mutex_types.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_MUTEX_TYPES_H
3 #define __LINUX_MUTEX_TYPES_H
4
5 #include <linux/atomic.h>
6 #include <linux/lockdep_types.h>
7 #include <linux/osq_lock.h>
8 #include <linux/spinlock_types.h>
9 #include <linux/types.h>
10
11 #ifndef CONFIG_PREEMPT_RT
12
13 /*
14  * Simple, straightforward mutexes with strict semantics:
15  *
16  * - only one task can hold the mutex at a time
17  * - only the owner can unlock the mutex
18  * - multiple unlocks are not permitted
19  * - recursive locking is not permitted
20  * - a mutex object must be initialized via the API
21  * - a mutex object must not be initialized via memset or copying
22  * - task may not exit with mutex held
23  * - memory areas where held locks reside must not be freed
24  * - held mutexes must not be reinitialized
25  * - mutexes may not be used in hardware or software interrupt
26  *   contexts such as tasklets and timers
27  *
28  * These semantics are fully enforced when DEBUG_MUTEXES is
29  * enabled. Furthermore, besides enforcing the above rules, the mutex
30  * debugging code also implements a number of additional features
31  * that make lock debugging easier and faster:
32  *
33  * - uses symbolic names of mutexes, whenever they are printed in debug output
34  * - point-of-acquire tracking, symbolic lookup of function names
35  * - list of all locks held in the system, printout of them
36  * - owner tracking
37  * - detects self-recursing locks and prints out all relevant info
38  * - detects multi-task circular deadlocks and prints out all affected
39  *   locks and tasks (and only those tasks)
40  */
41 struct mutex {
42         atomic_long_t           owner;
43         raw_spinlock_t          wait_lock;
44 #ifdef CONFIG_MUTEX_SPIN_ON_OWNER
45         struct optimistic_spin_queue osq; /* Spinner MCS lock */
46 #endif
47         struct list_head        wait_list;
48 #ifdef CONFIG_DEBUG_MUTEXES
49         void                    *magic;
50 #endif
51 #ifdef CONFIG_DEBUG_LOCK_ALLOC
52         struct lockdep_map      dep_map;
53 #endif
54 };
55
56 #else /* !CONFIG_PREEMPT_RT */
57 /*
58  * Preempt-RT variant based on rtmutexes.
59  */
60 #include <linux/rtmutex.h>
61
62 struct mutex {
63         struct rt_mutex_base    rtmutex;
64 #ifdef CONFIG_DEBUG_LOCK_ALLOC
65         struct lockdep_map      dep_map;
66 #endif
67 };
68
69 #endif /* CONFIG_PREEMPT_RT */
70
71 #endif /* __LINUX_MUTEX_TYPES_H */