| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef __LINUX_MUTEX_TYPES_H | |
| #define __LINUX_MUTEX_TYPES_H | |
| #include <linux/atomic.h> | |
| #include <linux/lockdep_types.h> | |
| #include <linux/osq_lock.h> | |
| #include <linux/spinlock_types.h> | |
| #include <linux/types.h> | |
| #ifndef CONFIG_PREEMPT_RT | |
| /* | |
| * Simple, straightforward mutexes with strict semantics: | |
| * | |
| * - only one task can hold the mutex at a time | |
| * - only the owner can unlock the mutex | |
| * - multiple unlocks are not permitted | |
| * - recursive locking is not permitted | |
| * - a mutex object must be initialized via the API | |
| * - a mutex object must not be initialized via memset or copying | |
| * - task may not exit with mutex held | |
| * - memory areas where held locks reside must not be freed | |
| * - held mutexes must not be reinitialized | |
| * - mutexes may not be used in hardware or software interrupt | |
| * contexts such as tasklets and timers | |
| * | |
| * These semantics are fully enforced when DEBUG_MUTEXES is | |
| * enabled. Furthermore, besides enforcing the above rules, the mutex | |
| * debugging code also implements a number of additional features | |
| * that make lock debugging easier and faster: | |
| * | |
| * - uses symbolic names of mutexes, whenever they are printed in debug output | |
| * - point-of-acquire tracking, symbolic lookup of function names | |
| * - list of all locks held in the system, printout of them | |
| * - owner tracking | |
| * - detects self-recursing locks and prints out all relevant info | |
| * - detects multi-task circular deadlocks and prints out all affected | |
| * locks and tasks (and only those tasks) | |
| */ | |
| context_lock_struct(mutex) { | |
| atomic_long_t owner; | |
| raw_spinlock_t wait_lock; | |
| #ifdef CONFIG_MUTEX_SPIN_ON_OWNER | |
| struct optimistic_spin_queue osq; /* Spinner MCS lock */ | |
| #endif | |
| struct mutex_waiter *first_waiter __guarded_by(&wait_lock); | |
| #ifdef CONFIG_DEBUG_MUTEXES | |
| void *magic; | |
| #endif | |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC | |
| struct lockdep_map dep_map; | |
| #endif | |
| }; | |
| #else /* !CONFIG_PREEMPT_RT */ | |
| /* | |
| * Preempt-RT variant based on rtmutexes. | |
| */ | |
| #include <linux/rtmutex.h> | |
| context_lock_struct(mutex) { | |
| struct rt_mutex_base rtmutex; | |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC | |
| struct lockdep_map dep_map; | |
| #endif | |
| }; | |
| #endif /* CONFIG_PREEMPT_RT */ | |
| #endif /* __LINUX_MUTEX_TYPES_H */ |