locking fix
Linus,
Please pull the latest locking/urgent Git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking-urgent-2024-12-29
# HEAD: 4a077914578183ec397ad09f7156a357e00e5d72 locking/rtmutex: Make sure we wake anything on the wake_q when we release the lock->wait_lock
Fix missed rtmutex wakeups causing sporadic boot hangs and other misbehavior.
Thanks,
Ingo
------------------>
John Stultz (1):
locking/rtmutex: Make sure we wake anything on the wake_q when we release the lock->wait_lock
kernel/locking/rtmutex.c | 18 ++++++++++++++++-- kernel/locking/rtmutex_api.c | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-)
kernel/locking/rtmutex.c +16 -2
@@ -1292,7 +1292,13 @@ static int __sched task_blocks_on_rt_mutex(struct rt_mutex_base *lock,*/ get_task_struct (owner); +preempt_disable ();raw_spin_unlock_irq (&lock->wait_lock); +/* wake up any tasks on the wake_q before calling rt_mutex_adjust_prio_chain */ +wake_up_q (wake_q); +wake_q_init (wake_q); +preempt_enable (); + res =rt_mutex_adjust_prio_chain (owner, chwalk, lock, next_lock, waiter, task);
@@ -1596,6 +1602,7 @@ static void __sched remove_waiter(struct rt_mutex_base *lock,* or TASK_UNINTERRUPTIBLE) * @timeout: the pre-initialized and started timer, or NULL for none * @waiter: the pre-initialized rt_mutex_waiter +* @wake_q: wake_q of tasks to wake when we drop the lock->wait_lock * * Must be called with lock->wait_lock held and interrupts disabled */
@@ -1603,7 +1610,8 @@ static int __sched rt_mutex_slowlock_block(struct rt_mutex_base *lock,struct ww_acquire_ctx *ww_ctx, unsigned int state, struct hrtimer_sleeper *timeout, - struct rt_mutex_waiter *waiter) + struct rt_mutex_waiter *waiter, + struct wake_q_head *wake_q) __releases(&lock->wait_lock) __acquires(&lock->wait_lock) { struct rt_mutex *rtm = container_of(lock, struct rt_mutex, rtmutex);
@@ -1634,7 +1642,13 @@ static int __sched rt_mutex_slowlock_block(struct rt_mutex_base *lock, owner =rt_mutex_owner (lock); else owner =NULL ; +preempt_disable ();raw_spin_unlock_irq (&lock->wait_lock); +if (wake_q) { +wake_up_q (wake_q); +wake_q_init (wake_q); + } +preempt_enable ();if (!owner || !rtmutex_spin_on_owner (lock, waiter, owner))rt_mutex_schedule ();
@@ -1708,7 +1722,7 @@ static int __sched __rt_mutex_slowlock(struct rt_mutex_base *lock, ret =task_blocks_on_rt_mutex (lock, waiter, current, ww_ctx, chwalk, wake_q);if (likely (!ret)) - ret =rt_mutex_slowlock_block (lock, ww_ctx, state,NULL , waiter); + ret =rt_mutex_slowlock_block (lock, ww_ctx, state,NULL , waiter, wake_q);if (likely (!ret)) {/* acquired the lock */
kernel/locking/rtmutex_api.c +1 -1
@@ -383,7 +383,7 @@ int __sched rt_mutex_wait_proxy_lock(struct rt_mutex_base *lock,raw_spin_lock_irq (&lock->wait_lock);/* sleep on the mutex */ set_current_state (TASK_INTERRUPTIBLE ); - ret =rt_mutex_slowlock_block (lock,NULL ,TASK_INTERRUPTIBLE , to, waiter); + ret =rt_mutex_slowlock_block (lock,NULL ,TASK_INTERRUPTIBLE , to, waiter,NULL );/* * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might * have to fix that up.
The pull request you sent on Sun, 29 Dec 2024 09:46:20 +0100:
The pull request you sent on Sun, 29 Dec 2024 09:46:20 +0100:
Quoted 1 line
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.gitlocking-urgent-2024-12-29
has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/bf7a281b806342ff0750827853bf16e53a082073
Thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/prtracker.html