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