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 */
41struct 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
62struct 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