Commit | Line | Data |
---|---|---|
23f78d4a IM |
1 | /* |
2 | * RT Mutexes: blocking mutual exclusion locks with PI support | |
3 | * | |
4 | * started by Ingo Molnar and Thomas Gleixner: | |
5 | * | |
6 | * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | |
7 | * Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com> | |
8 | * | |
9 | * This file contains the private data structure and API definitions. | |
10 | */ | |
11 | ||
12 | #ifndef __KERNEL_RTMUTEX_COMMON_H | |
13 | #define __KERNEL_RTMUTEX_COMMON_H | |
14 | ||
15 | #include <linux/rtmutex.h> | |
16 | ||
17 | /* | |
18 | * This is the control structure for tasks blocked on a rt_mutex, | |
19 | * which is allocated on the kernel stack on of the blocked task. | |
20 | * | |
fb00aca4 PZ |
21 | * @tree_entry: pi node to enqueue into the mutex waiters tree |
22 | * @pi_tree_entry: pi node to enqueue into the mutex owner waiters tree | |
23f78d4a IM |
23 | * @task: task reference to the blocked task |
24 | */ | |
25 | struct rt_mutex_waiter { | |
fb00aca4 PZ |
26 | struct rb_node tree_entry; |
27 | struct rb_node pi_tree_entry; | |
23f78d4a IM |
28 | struct task_struct *task; |
29 | struct rt_mutex *lock; | |
30 | #ifdef CONFIG_DEBUG_RT_MUTEXES | |
31 | unsigned long ip; | |
48d13e48 | 32 | struct pid *deadlock_task_pid; |
23f78d4a IM |
33 | struct rt_mutex *deadlock_lock; |
34 | #endif | |
2d3d891d | 35 | int prio; |
23f78d4a IM |
36 | }; |
37 | ||
38 | /* | |
fb00aca4 | 39 | * Various helpers to access the waiters-tree: |
23f78d4a IM |
40 | */ |
41 | static inline int rt_mutex_has_waiters(struct rt_mutex *lock) | |
42 | { | |
fb00aca4 | 43 | return !RB_EMPTY_ROOT(&lock->waiters); |
23f78d4a IM |
44 | } |
45 | ||
46 | static inline struct rt_mutex_waiter * | |
47 | rt_mutex_top_waiter(struct rt_mutex *lock) | |
48 | { | |
49 | struct rt_mutex_waiter *w; | |
50 | ||
fb00aca4 PZ |
51 | w = rb_entry(lock->waiters_leftmost, struct rt_mutex_waiter, |
52 | tree_entry); | |
23f78d4a IM |
53 | BUG_ON(w->lock != lock); |
54 | ||
55 | return w; | |
56 | } | |
57 | ||
58 | static inline int task_has_pi_waiters(struct task_struct *p) | |
59 | { | |
fb00aca4 | 60 | return !RB_EMPTY_ROOT(&p->pi_waiters); |
23f78d4a IM |
61 | } |
62 | ||
63 | static inline struct rt_mutex_waiter * | |
64 | task_top_pi_waiter(struct task_struct *p) | |
65 | { | |
fb00aca4 PZ |
66 | return rb_entry(p->pi_waiters_leftmost, struct rt_mutex_waiter, |
67 | pi_tree_entry); | |
23f78d4a IM |
68 | } |
69 | ||
70 | /* | |
71 | * lock->owner state tracking: | |
72 | */ | |
8161239a LJ |
73 | #define RT_MUTEX_HAS_WAITERS 1UL |
74 | #define RT_MUTEX_OWNER_MASKALL 1UL | |
23f78d4a IM |
75 | |
76 | static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock) | |
77 | { | |
78 | return (struct task_struct *) | |
79 | ((unsigned long)lock->owner & ~RT_MUTEX_OWNER_MASKALL); | |
80 | } | |
81 | ||
8930ed80 TG |
82 | /* |
83 | * Constants for rt mutex functions which have a selectable deadlock | |
84 | * detection. | |
85 | * | |
86 | * RT_MUTEX_MIN_CHAINWALK: Stops the lock chain walk when there are | |
87 | * no further PI adjustments to be made. | |
88 | * | |
89 | * RT_MUTEX_FULL_CHAINWALK: Invoke deadlock detection with a full | |
90 | * walk of the lock chain. | |
91 | */ | |
92 | enum rtmutex_chainwalk { | |
93 | RT_MUTEX_MIN_CHAINWALK, | |
94 | RT_MUTEX_FULL_CHAINWALK, | |
95 | }; | |
96 | ||
c87e2837 IM |
97 | /* |
98 | * PI-futex support (proxy locking functions, etc.): | |
99 | */ | |
100 | extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); | |
101 | extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, | |
102 | struct task_struct *proxy_owner); | |
103 | extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, | |
104 | struct task_struct *proxy_owner); | |
8dac456a DH |
105 | extern int rt_mutex_start_proxy_lock(struct rt_mutex *lock, |
106 | struct rt_mutex_waiter *waiter, | |
c051b21f | 107 | struct task_struct *task); |
8dac456a DH |
108 | extern int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, |
109 | struct hrtimer_sleeper *to, | |
c051b21f TG |
110 | struct rt_mutex_waiter *waiter); |
111 | extern int rt_mutex_timed_futex_lock(struct rt_mutex *l, struct hrtimer_sleeper *to); | |
802ab58d SAS |
112 | extern bool rt_mutex_futex_unlock(struct rt_mutex *lock, |
113 | struct wake_q_head *wqh); | |
114 | extern void rt_mutex_adjust_prio(struct task_struct *task); | |
36cf3b5c TG |
115 | |
116 | #ifdef CONFIG_DEBUG_RT_MUTEXES | |
117 | # include "rtmutex-debug.h" | |
118 | #else | |
119 | # include "rtmutex.h" | |
120 | #endif | |
121 | ||
23f78d4a | 122 | #endif |