xref: /linux/include/linux/mutex_types.h (revision 021bc4b9)
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 */
72