diff options
Diffstat (limited to 'debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch')
-rw-r--r-- | debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch b/debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch index 04ab90bc8..d8d2cdf39 100644 --- a/debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch +++ b/debian/patches-rt/0015-locking-rtmutex-add-sleeping-lock-implementation.patch @@ -1,7 +1,7 @@ From: Thomas Gleixner <tglx@linutronix.de> Date: Thu, 12 Oct 2017 17:11:19 +0200 Subject: [PATCH 15/22] locking/rtmutex: add sleeping lock implementation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.8-rt24.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.21-rt34.tar.xz Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> @@ -14,17 +14,17 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> include/linux/spinlock_rt.h | 155 +++++++++++++ include/linux/spinlock_types_rt.h | 38 +++ kernel/fork.c | 1 - kernel/futex.c | 11 + kernel/futex.c | 10 kernel/locking/rtmutex.c | 444 ++++++++++++++++++++++++++++++++++---- kernel/locking/rtmutex_common.h | 14 - kernel/sched/core.c | 39 ++- - 12 files changed, 694 insertions(+), 56 deletions(-) + 12 files changed, 694 insertions(+), 55 deletions(-) create mode 100644 include/linux/spinlock_rt.h create mode 100644 include/linux/spinlock_types_rt.h --- a/include/linux/kernel.h +++ b/include/linux/kernel.h -@@ -220,6 +220,10 @@ +@@ -220,6 +220,10 @@ extern void __cant_migrate(const char *f */ # define might_sleep() \ do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) @@ -35,7 +35,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /** * cant_sleep - annotation for functions that cannot sleep * -@@ -263,6 +267,7 @@ +@@ -263,6 +267,7 @@ extern void __cant_migrate(const char *f static inline void __might_sleep(const char *file, int line, int preempt_offset) { } # define might_sleep() do { might_resched(); } while (0) @@ -70,7 +70,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /** * The rt_mutex structure * -@@ -31,6 +35,7 @@ +@@ -31,6 +35,7 @@ struct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct task_struct *owner; @@ -78,7 +78,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> #ifdef CONFIG_DEBUG_LOCK_ALLOC struct lockdep_map dep_map; #endif -@@ -67,11 +72,19 @@ +@@ -67,11 +72,19 @@ do { \ #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) #endif @@ -103,7 +103,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) --- a/include/linux/sched.h +++ b/include/linux/sched.h -@@ -141,6 +141,9 @@ +@@ -141,6 +141,9 @@ struct io_uring_task; smp_store_mb(current->state, (state_value)); \ } while (0) @@ -113,7 +113,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> #define set_special_state(state_value) \ do { \ unsigned long flags; /* may shadow */ \ -@@ -194,6 +197,9 @@ +@@ -194,6 +197,9 @@ struct io_uring_task; #define set_current_state(state_value) \ smp_store_mb(current->state, (state_value)) @@ -123,7 +123,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * set_special_state() should be used for those states when the blocking task * can not use the regular condition based wait-loop. In that case we must -@@ -1014,6 +1020,7 @@ +@@ -1014,6 +1020,7 @@ struct task_struct { raw_spinlock_t pi_lock; struct wake_q_node wake_q; @@ -133,7 +133,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* PI waiters blocked on a rt_mutex held by this task: */ --- a/include/linux/sched/wake_q.h +++ b/include/linux/sched/wake_q.h -@@ -58,6 +58,17 @@ +@@ -58,6 +58,17 @@ static inline bool wake_q_empty(struct w extern void wake_q_add(struct wake_q_head *head, struct task_struct *task); extern void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task); @@ -353,7 +353,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +#endif --- a/kernel/fork.c +++ b/kernel/fork.c -@@ -931,6 +931,7 @@ +@@ -926,6 +926,7 @@ static struct task_struct *dup_task_stru tsk->splice_pipe = NULL; tsk->task_frag.page = NULL; tsk->wake_q.next = NULL; @@ -363,7 +363,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- a/kernel/futex.c +++ b/kernel/futex.c -@@ -1499,6 +1499,7 @@ +@@ -1499,6 +1499,7 @@ static int wake_futex_pi(u32 __user *uad struct task_struct *new_owner; bool postunlock = false; DEFINE_WAKE_Q(wake_q); @@ -371,7 +371,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> int ret = 0; new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); -@@ -1548,14 +1549,15 @@ +@@ -1548,14 +1549,15 @@ static int wake_futex_pi(u32 __user *uad * not fail. */ pi_state_update_owner(pi_state, new_owner); @@ -389,7 +389,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> return ret; } -@@ -2859,7 +2861,7 @@ +@@ -2859,7 +2861,7 @@ static int futex_lock_pi(u32 __user *uad goto no_block; } @@ -398,7 +398,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not -@@ -3205,7 +3207,7 @@ +@@ -3205,7 +3207,7 @@ static int futex_wait_requeue_pi(u32 __u * The waiter is allocated on our stack, manipulated by the requeue * code while we sleep on uaddr. */ @@ -421,7 +421,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> * * See Documentation/locking/rt-mutex-design.rst for details. */ -@@ -233,7 +238,7 @@ +@@ -233,7 +238,7 @@ static inline bool unlock_rt_mutex_safe( * Only use with rt_mutex_waiter_{less,equal}() */ #define task_to_waiter(p) \ @@ -430,7 +430,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> static inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left, -@@ -273,6 +278,27 @@ +@@ -273,6 +278,27 @@ rt_mutex_waiter_equal(struct rt_mutex_wa return 1; } @@ -458,7 +458,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> static void rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) { -@@ -377,6 +403,14 @@ +@@ -377,6 +403,14 @@ static bool rt_mutex_cond_detect_deadloc return debug_rt_mutex_detect_deadlock(waiter, chwalk); } @@ -473,7 +473,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * Max number of times we'll walk the boosting chain: */ -@@ -700,13 +734,16 @@ +@@ -700,13 +734,16 @@ static int rt_mutex_adjust_prio_chain(st * follow here. This is the end of the chain we are walking. */ if (!rt_mutex_owner(lock)) { @@ -492,7 +492,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> raw_spin_unlock_irq(&lock->wait_lock); return 0; } -@@ -807,9 +844,11 @@ +@@ -807,9 +844,11 @@ static int rt_mutex_adjust_prio_chain(st * @task: The task which wants to acquire the lock * @waiter: The waiter that is queued to the lock's wait tree if the * callsite called task_blocked_on_lock(), otherwise NULL @@ -506,7 +506,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> { lockdep_assert_held(&lock->wait_lock); -@@ -845,12 +884,11 @@ +@@ -845,12 +884,11 @@ static int try_to_take_rt_mutex(struct r */ if (waiter) { /* @@ -522,7 +522,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * We can acquire the lock. Remove the waiter from the * lock waiters tree. -@@ -868,14 +906,12 @@ +@@ -868,14 +906,12 @@ static int try_to_take_rt_mutex(struct r */ if (rt_mutex_has_waiters(lock)) { /* @@ -541,7 +541,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * The current top waiter stays enqueued. We * don't have to change anything in the lock -@@ -922,6 +958,289 @@ +@@ -922,6 +958,289 @@ static int try_to_take_rt_mutex(struct r return 1; } @@ -831,7 +831,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * Task blocks on lock. * -@@ -1035,6 +1354,7 @@ +@@ -1035,6 +1354,7 @@ static int task_blocks_on_rt_mutex(struc * Called with lock->wait_lock held and interrupts disabled. */ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, @@ -839,7 +839,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> struct rt_mutex *lock) { struct rt_mutex_waiter *waiter; -@@ -1074,7 +1394,10 @@ +@@ -1074,7 +1394,10 @@ static void mark_wakeup_next_waiter(stru * Pairs with preempt_enable() in rt_mutex_postunlock(); */ preempt_disable(); @@ -851,7 +851,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> raw_spin_unlock(¤t->pi_lock); } -@@ -1158,21 +1481,22 @@ +@@ -1158,21 +1481,22 @@ void rt_mutex_adjust_pi(struct task_stru return; } next_lock = waiter->lock; @@ -876,7 +876,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } /** -@@ -1283,7 +1607,7 @@ +@@ -1283,7 +1607,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, unsigned long flags; int ret = 0; @@ -885,7 +885,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * Technically we could use raw_spin_[un]lock_irq() here, but this can -@@ -1356,7 +1680,8 @@ +@@ -1356,7 +1680,8 @@ static inline int rt_mutex_slowtrylock(s * Return whether the current task needs to call rt_mutex_postunlock(). */ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, @@ -895,7 +895,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> { unsigned long flags; -@@ -1410,7 +1735,7 @@ +@@ -1410,7 +1735,7 @@ static bool __sched rt_mutex_slowunlock( * * Queue the next waiter for wakeup once we release the wait_lock. */ @@ -904,7 +904,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> raw_spin_unlock_irqrestore(&lock->wait_lock, flags); return true; /* call rt_mutex_postunlock() */ -@@ -1447,9 +1772,11 @@ +@@ -1447,9 +1772,11 @@ rt_mutex_fasttrylock(struct rt_mutex *lo /* * Performs the wakeup of the the top-waiter and re-enables preemption. */ @@ -917,7 +917,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ preempt_enable(); -@@ -1458,15 +1785,17 @@ +@@ -1458,15 +1785,17 @@ void rt_mutex_postunlock(struct wake_q_h static inline void rt_mutex_fastunlock(struct rt_mutex *lock, bool (*slowfn)(struct rt_mutex *lock, @@ -938,7 +938,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) -@@ -1597,16 +1926,13 @@ +@@ -1597,16 +1926,13 @@ void __sched __rt_mutex_unlock(struct rt void __sched rt_mutex_unlock(struct rt_mutex *lock) { mutex_release(&lock->dep_map, _RET_IP_); @@ -959,7 +959,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> { lockdep_assert_held(&lock->wait_lock); -@@ -1623,23 +1949,35 @@ +@@ -1623,23 +1949,35 @@ bool __sched __rt_mutex_futex_unlock(str * avoid inversion prior to the wakeup. preempt_disable() * therein pairs with rt_mutex_postunlock(). */ @@ -998,7 +998,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } /** -@@ -1675,7 +2013,7 @@ +@@ -1675,7 +2013,7 @@ void __rt_mutex_init(struct rt_mutex *lo if (name && key) debug_rt_mutex_init(lock, name, key); } @@ -1007,7 +1007,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /** * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a -@@ -1695,6 +2033,14 @@ +@@ -1695,6 +2033,14 @@ void rt_mutex_init_proxy_locked(struct r struct task_struct *proxy_owner) { __rt_mutex_init(lock, NULL, NULL); @@ -1022,7 +1022,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> debug_rt_mutex_proxy_lock(lock, proxy_owner); rt_mutex_set_owner(lock, proxy_owner); } -@@ -1717,6 +2063,26 @@ +@@ -1717,6 +2063,26 @@ void rt_mutex_proxy_unlock(struct rt_mut rt_mutex_set_owner(lock, NULL); } @@ -1049,7 +1049,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /** * __rt_mutex_start_proxy_lock() - Start lock acquisition for another task * @lock: the rt_mutex to take -@@ -1789,6 +2155,9 @@ +@@ -1789,6 +2155,9 @@ int __rt_mutex_start_proxy_lock(struct r ret = 0; } @@ -1059,7 +1059,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> return ret; } -@@ -1878,6 +2247,9 @@ +@@ -1878,6 +2247,9 @@ int rt_mutex_wait_proxy_lock(struct rt_m * have to fix that up. */ fixup_rt_mutex_waiters(lock); @@ -1071,7 +1071,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> return ret; --- a/kernel/locking/rtmutex_common.h +++ b/kernel/locking/rtmutex_common.h -@@ -31,6 +31,7 @@ +@@ -31,6 +31,7 @@ struct rt_mutex_waiter { struct task_struct *task; struct rt_mutex *lock; int prio; @@ -1079,7 +1079,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> u64 deadline; }; -@@ -133,7 +134,7 @@ +@@ -133,7 +134,7 @@ extern struct task_struct *rt_mutex_next extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, struct task_struct *proxy_owner); extern void rt_mutex_proxy_unlock(struct rt_mutex *lock); @@ -1088,7 +1088,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, struct task_struct *task); -@@ -151,9 +152,12 @@ +@@ -151,9 +152,12 @@ extern int __rt_mutex_futex_trylock(stru extern void rt_mutex_futex_unlock(struct rt_mutex *lock); extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, @@ -1103,7 +1103,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* RW semaphore special interface */ extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); -@@ -163,6 +167,10 @@ +@@ -163,6 +167,10 @@ int __sched rt_mutex_slowlock_locked(str struct hrtimer_sleeper *timeout, enum rtmutex_chainwalk chwalk, struct rt_mutex_waiter *waiter); @@ -1116,7 +1116,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> # include "rtmutex-debug.h" --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -512,9 +512,15 @@ +@@ -510,9 +510,15 @@ static bool set_nr_if_polling(struct tas #endif #endif @@ -1134,7 +1134,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> /* * Atomically grab the task, if ->wake_q is !nil already it means -@@ -550,7 +556,13 @@ +@@ -548,7 +554,13 @@ static bool __wake_q_add(struct wake_q_h */ void wake_q_add(struct wake_q_head *head, struct task_struct *task) { @@ -1149,7 +1149,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> get_task_struct(task); } -@@ -573,28 +585,39 @@ +@@ -571,28 +583,39 @@ void wake_q_add(struct wake_q_head *head */ void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task) { |