]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - kernel/locking/rtmutex_common.h
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / kernel / locking / rtmutex_common.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
23f78d4a
IM
2/*
3 * RT Mutexes: blocking mutual exclusion locks with PI support
4 *
5 * started by Ingo Molnar and Thomas Gleixner:
6 *
7 * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
8 * Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
9 *
10 * This file contains the private data structure and API definitions.
11 */
12
13#ifndef __KERNEL_RTMUTEX_COMMON_H
14#define __KERNEL_RTMUTEX_COMMON_H
15
16#include <linux/rtmutex.h>
84f001e1 17#include <linux/sched/wake_q.h>
23f78d4a
IM
18
19/*
20 * This is the control structure for tasks blocked on a rt_mutex,
21 * which is allocated on the kernel stack on of the blocked task.
22 *
fb00aca4
PZ
23 * @tree_entry: pi node to enqueue into the mutex waiters tree
24 * @pi_tree_entry: pi node to enqueue into the mutex owner waiters tree
23f78d4a
IM
25 * @task: task reference to the blocked task
26 */
27struct rt_mutex_waiter {
fb00aca4
PZ
28 struct rb_node tree_entry;
29 struct rb_node pi_tree_entry;
23f78d4a
IM
30 struct task_struct *task;
31 struct rt_mutex *lock;
32#ifdef CONFIG_DEBUG_RT_MUTEXES
33 unsigned long ip;
48d13e48 34 struct pid *deadlock_task_pid;
23f78d4a
IM
35 struct rt_mutex *deadlock_lock;
36#endif
2d3d891d 37 int prio;
e0aad5b4 38 u64 deadline;
23f78d4a
IM
39};
40
41/*
fb00aca4 42 * Various helpers to access the waiters-tree:
23f78d4a 43 */
bc2eecd7
NP
44
45#ifdef CONFIG_RT_MUTEXES
46
23f78d4a
IM
47static inline int rt_mutex_has_waiters(struct rt_mutex *lock)
48{
a23ba907 49 return !RB_EMPTY_ROOT(&lock->waiters.rb_root);
23f78d4a
IM
50}
51
52static inline struct rt_mutex_waiter *
53rt_mutex_top_waiter(struct rt_mutex *lock)
54{
55 struct rt_mutex_waiter *w;
56
a23ba907
DB
57 w = rb_entry(lock->waiters.rb_leftmost,
58 struct rt_mutex_waiter, tree_entry);
23f78d4a
IM
59 BUG_ON(w->lock != lock);
60
61 return w;
62}
63
64static inline int task_has_pi_waiters(struct task_struct *p)
65{
a23ba907 66 return !RB_EMPTY_ROOT(&p->pi_waiters.rb_root);
23f78d4a
IM
67}
68
69static inline struct rt_mutex_waiter *
70task_top_pi_waiter(struct task_struct *p)
71{
a23ba907
DB
72 return rb_entry(p->pi_waiters.rb_leftmost,
73 struct rt_mutex_waiter, pi_tree_entry);
23f78d4a
IM
74}
75
bc2eecd7
NP
76#else
77
78static inline int rt_mutex_has_waiters(struct rt_mutex *lock)
79{
80 return false;
81}
82
83static inline struct rt_mutex_waiter *
84rt_mutex_top_waiter(struct rt_mutex *lock)
85{
86 return NULL;
87}
88
89static inline int task_has_pi_waiters(struct task_struct *p)
90{
91 return false;
92}
93
94static inline struct rt_mutex_waiter *
95task_top_pi_waiter(struct task_struct *p)
96{
97 return NULL;
98}
99
100#endif
101
23f78d4a
IM
102/*
103 * lock->owner state tracking:
104 */
8161239a 105#define RT_MUTEX_HAS_WAITERS 1UL
23f78d4a
IM
106
107static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
108{
1be5d4fa
TG
109 unsigned long owner = (unsigned long) READ_ONCE(lock->owner);
110
b5016e82 111 return (struct task_struct *) (owner & ~RT_MUTEX_HAS_WAITERS);
23f78d4a
IM
112}
113
8930ed80
TG
114/*
115 * Constants for rt mutex functions which have a selectable deadlock
116 * detection.
117 *
118 * RT_MUTEX_MIN_CHAINWALK: Stops the lock chain walk when there are
119 * no further PI adjustments to be made.
120 *
121 * RT_MUTEX_FULL_CHAINWALK: Invoke deadlock detection with a full
122 * walk of the lock chain.
123 */
124enum rtmutex_chainwalk {
125 RT_MUTEX_MIN_CHAINWALK,
126 RT_MUTEX_FULL_CHAINWALK,
127};
128
c87e2837
IM
129/*
130 * PI-futex support (proxy locking functions, etc.):
131 */
132extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
133extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
134 struct task_struct *proxy_owner);
135extern void rt_mutex_proxy_unlock(struct rt_mutex *lock,
136 struct task_struct *proxy_owner);
50809358 137extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter);
56222b21
PZ
138extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
139 struct rt_mutex_waiter *waiter,
140 struct task_struct *task);
8dac456a
DH
141extern int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
142 struct rt_mutex_waiter *waiter,
c051b21f 143 struct task_struct *task);
38d589f2
PZ
144extern int rt_mutex_wait_proxy_lock(struct rt_mutex *lock,
145 struct hrtimer_sleeper *to,
146 struct rt_mutex_waiter *waiter);
147extern bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock,
148 struct rt_mutex_waiter *waiter);
5293c2ef 149
5293c2ef 150extern int rt_mutex_futex_trylock(struct rt_mutex *l);
c1e2f0ea 151extern int __rt_mutex_futex_trylock(struct rt_mutex *l);
5293c2ef
PZ
152
153extern void rt_mutex_futex_unlock(struct rt_mutex *lock);
154extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock,
155 struct wake_q_head *wqh);
156
aa2bfe55 157extern void rt_mutex_postunlock(struct wake_q_head *wake_q);
36cf3b5c
TG
158
159#ifdef CONFIG_DEBUG_RT_MUTEXES
160# include "rtmutex-debug.h"
161#else
162# include "rtmutex.h"
163#endif
164
23f78d4a 165#endif