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 | |