History

Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull locking fix from Thomas Gleixner: "A single commit, which makes the rtmutex.wait_lock an irq safe lock. This prevents a potential deadlock which can be triggered by the rcu boosting code from rcu_read_unlock()" * 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: rtmutex: Make wait_lock irq safe

Linus Torvalds committed 10 years ago

Commit bbfb2392 parents 30e4c9a b4abf912 files · +81 −72Browse files

Showing the changes to kernel (2 of 2 files). Show all

Unified · Split

2 files
  1. kernel/futex.c +9 −9
  2. kernel/locking/rtmutex.c +72 −63
kernel/futex.c+9−9
@@ -1191,7 +1191,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this, · 1190 unmodified lines
1191 if (pi_state->owner != current)1191 if (pi_state->owner != current)
1192 return -EINVAL;1192 return -EINVAL;
1193 1193
1194 raw_spin_lock(&pi_state->pi_mutex.wait_lock);1194 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
1195 new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);1195 new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
1196 1196
1197 /*1197 /*
@@ -1217,22 +1217,22 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this, · 19 unmodified lines
1217 else if (curval != uval)1217 else if (curval != uval)
1218 ret = -EINVAL;1218 ret = -EINVAL;
1219 if (ret) {1219 if (ret) {
1220 raw_spin_unlock(&pi_state->pi_mutex.wait_lock);1220 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
1221 return ret;1221 return ret;
1222 }1222 }
1223 1223
1224 raw_spin_lock_irq(&pi_state->owner->pi_lock);1224 raw_spin_lock(&pi_state->owner->pi_lock);
1225 WARN_ON(list_empty(&pi_state->list));1225 WARN_ON(list_empty(&pi_state->list));
1226 list_del_init(&pi_state->list);1226 list_del_init(&pi_state->list);
1227 raw_spin_unlock_irq(&pi_state->owner->pi_lock);1227 raw_spin_unlock(&pi_state->owner->pi_lock);
1228 1228
1229 raw_spin_lock_irq(&new_owner->pi_lock);1229 raw_spin_lock(&new_owner->pi_lock);
1230 WARN_ON(!list_empty(&pi_state->list));1230 WARN_ON(!list_empty(&pi_state->list));
1231 list_add(&pi_state->list, &new_owner->pi_state_list);1231 list_add(&pi_state->list, &new_owner->pi_state_list);
1232 pi_state->owner = new_owner;1232 pi_state->owner = new_owner;
1233 raw_spin_unlock_irq(&new_owner->pi_lock);1233 raw_spin_unlock(&new_owner->pi_lock);
1234 1234
1235 raw_spin_unlock(&pi_state->pi_mutex.wait_lock);1235 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
1236 1236
1237 deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);1237 deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
1238 1238
@@ -2127,11 +2127,11 @@ static int fixup_owner(u32 __user *uaddr, struct futex_q *q, int locked) · 888 unmodified lines
2127 * we returned due to timeout or signal without taking the2127 * we returned due to timeout or signal without taking the
2128 * rt_mutex. Too late.2128 * rt_mutex. Too late.
2129 */2129 */
2130 raw_spin_lock(&q->pi_state->pi_mutex.wait_lock);2130 raw_spin_lock_irq(&q->pi_state->pi_mutex.wait_lock);
2131 owner = rt_mutex_owner(&q->pi_state->pi_mutex);2131 owner = rt_mutex_owner(&q->pi_state->pi_mutex);
2132 if (!owner)2132 if (!owner)
2133 owner = rt_mutex_next_owner(&q->pi_state->pi_mutex);2133 owner = rt_mutex_next_owner(&q->pi_state->pi_mutex);
2134 raw_spin_unlock(&q->pi_state->pi_mutex.wait_lock);2134 raw_spin_unlock_irq(&q->pi_state->pi_mutex.wait_lock);
2135 ret = fixup_pi_state_owner(uaddr, q, owner);2135 ret = fixup_pi_state_owner(uaddr, q, owner);
2136 goto out;2136 goto out;
2137 }2137 }
kernel/locking/rtmutex.c+72−63
@@ -99,13 +99,14 @@ static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) · 98 unmodified lines
99 * 2) Drop lock->wait_lock99 * 2) Drop lock->wait_lock
100 * 3) Try to unlock the lock with cmpxchg100 * 3) Try to unlock the lock with cmpxchg
101 */101 */
102static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock)102static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock,
103 unsigned long flags)
103 __releases(lock->wait_lock)104 __releases(lock->wait_lock)
104{105{
105 struct task_struct *owner = rt_mutex_owner(lock);106 struct task_struct *owner = rt_mutex_owner(lock);
106 107
107 clear_rt_mutex_waiters(lock);108 clear_rt_mutex_waiters(lock);
108 raw_spin_unlock(&lock->wait_lock);109 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
109 /*110 /*
110 * If a new waiter comes in between the unlock and the cmpxchg111 * If a new waiter comes in between the unlock and the cmpxchg
111 * we have two situations:112 * we have two situations:
@@ -147,11 +148,12 @@ static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) · 35 unmodified lines
147/*148/*
148 * Simple slow path only version: lock->owner is protected by lock->wait_lock.149 * Simple slow path only version: lock->owner is protected by lock->wait_lock.
149 */150 */
150static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock)151static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock,
152 unsigned long flags)
151 __releases(lock->wait_lock)153 __releases(lock->wait_lock)
152{154{
153 lock->owner = NULL;155 lock->owner = NULL;
154 raw_spin_unlock(&lock->wait_lock);156 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
155 return true;157 return true;
156}158}
157#endif159#endif
@@ -433,7 +435,6 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 275 unmodified lines
433 int ret = 0, depth = 0;435 int ret = 0, depth = 0;
434 struct rt_mutex *lock;436 struct rt_mutex *lock;
435 bool detect_deadlock;437 bool detect_deadlock;
436 unsigned long flags;
437 bool requeue = true;438 bool requeue = true;
438 439
439 detect_deadlock = rt_mutex_cond_detect_deadlock(orig_waiter, chwalk);440 detect_deadlock = rt_mutex_cond_detect_deadlock(orig_waiter, chwalk);
@@ -476,7 +477,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 36 unmodified lines
476 /*477 /*
477 * [1] Task cannot go away as we did a get_task() before !478 * [1] Task cannot go away as we did a get_task() before !
478 */479 */
479 raw_spin_lock_irqsave(&task->pi_lock, flags);480 raw_spin_lock_irq(&task->pi_lock);
480 481
481 /*482 /*
482 * [2] Get the waiter on which @task is blocked on.483 * [2] Get the waiter on which @task is blocked on.
@@ -560,7 +561,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 77 unmodified lines
560 * operations.561 * operations.
561 */562 */
562 if (!raw_spin_trylock(&lock->wait_lock)) {563 if (!raw_spin_trylock(&lock->wait_lock)) {
563 raw_spin_unlock_irqrestore(&task->pi_lock, flags);564 raw_spin_unlock_irq(&task->pi_lock);
564 cpu_relax();565 cpu_relax();
565 goto retry;566 goto retry;
566 }567 }
@@ -591,7 +592,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 24 unmodified lines
591 /*592 /*
592 * No requeue[7] here. Just release @task [8]593 * No requeue[7] here. Just release @task [8]
593 */594 */
594 raw_spin_unlock_irqrestore(&task->pi_lock, flags);595 raw_spin_unlock(&task->pi_lock);
595 put_task_struct(task);596 put_task_struct(task);
596 597
597 /*598 /*
@@ -599,14 +600,14 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 1 unmodified line
599 * If there is no owner of the lock, end of chain.600 * If there is no owner of the lock, end of chain.
600 */601 */
601 if (!rt_mutex_owner(lock)) {602 if (!rt_mutex_owner(lock)) {
602 raw_spin_unlock(&lock->wait_lock);603 raw_spin_unlock_irq(&lock->wait_lock);
603 return 0;604 return 0;
604 }605 }
605 606
606 /* [10] Grab the next task, i.e. owner of @lock */607 /* [10] Grab the next task, i.e. owner of @lock */
607 task = rt_mutex_owner(lock);608 task = rt_mutex_owner(lock);
608 get_task_struct(task);609 get_task_struct(task);
609 raw_spin_lock_irqsave(&task->pi_lock, flags);610 raw_spin_lock(&task->pi_lock);
610 611
611 /*612 /*
612 * No requeue [11] here. We just do deadlock detection.613 * No requeue [11] here. We just do deadlock detection.
@@ -621,8 +622,8 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 8 unmodified lines
621 top_waiter = rt_mutex_top_waiter(lock);622 top_waiter = rt_mutex_top_waiter(lock);
622 623
623 /* [13] Drop locks */624 /* [13] Drop locks */
624 raw_spin_unlock_irqrestore(&task->pi_lock, flags);625 raw_spin_unlock(&task->pi_lock);
625 raw_spin_unlock(&lock->wait_lock);626 raw_spin_unlock_irq(&lock->wait_lock);
626 627
627 /* If owner is not blocked, end of chain. */628 /* If owner is not blocked, end of chain. */
628 if (!next_lock)629 if (!next_lock)
@@ -643,7 +644,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 14 unmodified lines
643 rt_mutex_enqueue(lock, waiter);644 rt_mutex_enqueue(lock, waiter);
644 645
645 /* [8] Release the task */646 /* [8] Release the task */
646 raw_spin_unlock_irqrestore(&task->pi_lock, flags);647 raw_spin_unlock(&task->pi_lock);
647 put_task_struct(task);648 put_task_struct(task);
648 649
649 /*650 /*
@@ -661,14 +662,14 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 11 unmodified lines
661 */662 */
662 if (prerequeue_top_waiter != rt_mutex_top_waiter(lock))663 if (prerequeue_top_waiter != rt_mutex_top_waiter(lock))
663 wake_up_process(rt_mutex_top_waiter(lock)->task);664 wake_up_process(rt_mutex_top_waiter(lock)->task);
664 raw_spin_unlock(&lock->wait_lock);665 raw_spin_unlock_irq(&lock->wait_lock);
665 return 0;666 return 0;
666 }667 }
667 668
668 /* [10] Grab the next task, i.e. the owner of @lock */669 /* [10] Grab the next task, i.e. the owner of @lock */
669 task = rt_mutex_owner(lock);670 task = rt_mutex_owner(lock);
670 get_task_struct(task);671 get_task_struct(task);
671 raw_spin_lock_irqsave(&task->pi_lock, flags);672 raw_spin_lock(&task->pi_lock);
672 673
673 /* [11] requeue the pi waiters if necessary */674 /* [11] requeue the pi waiters if necessary */
674 if (waiter == rt_mutex_top_waiter(lock)) {675 if (waiter == rt_mutex_top_waiter(lock)) {
@@ -722,8 +723,8 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 47 unmodified lines
722 top_waiter = rt_mutex_top_waiter(lock);723 top_waiter = rt_mutex_top_waiter(lock);
723 724
724 /* [13] Drop the locks */725 /* [13] Drop the locks */
725 raw_spin_unlock_irqrestore(&task->pi_lock, flags);726 raw_spin_unlock(&task->pi_lock);
726 raw_spin_unlock(&lock->wait_lock);727 raw_spin_unlock_irq(&lock->wait_lock);
727 728
728 /*729 /*
729 * Make the actual exit decisions [12], based on the stored730 * Make the actual exit decisions [12], based on the stored
@@ -746,7 +747,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 16 unmodified lines
746 goto again;747 goto again;
747 748
748 out_unlock_pi:749 out_unlock_pi:
749 raw_spin_unlock_irqrestore(&task->pi_lock, flags);750 raw_spin_unlock_irq(&task->pi_lock);
750 out_put_task:751 out_put_task:
751 put_task_struct(task);752 put_task_struct(task);
752 753
@@ -756,7 +757,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 3 unmodified lines
756/*757/*
757 * Try to take an rt-mutex758 * Try to take an rt-mutex
758 *759 *
759 * Must be called with lock->wait_lock held.760 * Must be called with lock->wait_lock held and interrupts disabled
760 *761 *
761 * @lock: The lock to be acquired.762 * @lock: The lock to be acquired.
762 * @task: The task which wants to acquire the lock763 * @task: The task which wants to acquire the lock
@@ -766,8 +767,6 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, · 3 unmodified lines
766static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task,767static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task,
767 struct rt_mutex_waiter *waiter)768 struct rt_mutex_waiter *waiter)
768{769{
769 unsigned long flags;
770
771 /*770 /*
772 * Before testing whether we can acquire @lock, we set the771 * Before testing whether we can acquire @lock, we set the
773 * RT_MUTEX_HAS_WAITERS bit in @lock->owner. This forces all772 * RT_MUTEX_HAS_WAITERS bit in @lock->owner. This forces all
@@ -852,7 +851,7 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, · 78 unmodified lines
852 * case, but conditionals are more expensive than a redundant851 * case, but conditionals are more expensive than a redundant
853 * store.852 * store.
854 */853 */
855 raw_spin_lock_irqsave(&task->pi_lock, flags);854 raw_spin_lock(&task->pi_lock);
856 task->pi_blocked_on = NULL;855 task->pi_blocked_on = NULL;
857 /*856 /*
858 * Finish the lock acquisition. @task is the new owner. If857 * Finish the lock acquisition. @task is the new owner. If
@@ -861,7 +860,7 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, · 2 unmodified lines
861 */860 */
862 if (rt_mutex_has_waiters(lock))861 if (rt_mutex_has_waiters(lock))
863 rt_mutex_enqueue_pi(task, rt_mutex_top_waiter(lock));862 rt_mutex_enqueue_pi(task, rt_mutex_top_waiter(lock));
864 raw_spin_unlock_irqrestore(&task->pi_lock, flags);863 raw_spin_unlock(&task->pi_lock);
865 864
866takeit:865takeit:
867 /* We got the lock. */866 /* We got the lock. */
@@ -883,7 +882,7 @@ takeit: · 15 unmodified lines
883 *882 *
884 * Prepare waiter and propagate pi chain883 * Prepare waiter and propagate pi chain
885 *884 *
886 * This must be called with lock->wait_lock held.885 * This must be called with lock->wait_lock held and interrupts disabled
887 */886 */
888static int task_blocks_on_rt_mutex(struct rt_mutex *lock,887static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
889 struct rt_mutex_waiter *waiter,888 struct rt_mutex_waiter *waiter,
@@ -894,7 +893,6 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 4 unmodified lines
894 struct rt_mutex_waiter *top_waiter = waiter;893 struct rt_mutex_waiter *top_waiter = waiter;
895 struct rt_mutex *next_lock;894 struct rt_mutex *next_lock;
896 int chain_walk = 0, res;895 int chain_walk = 0, res;
897 unsigned long flags;
898 896
899 /*897 /*
900 * Early deadlock detection. We really don't want the task to898 * Early deadlock detection. We really don't want the task to
@@ -908,7 +906,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 7 unmodified lines
908 if (owner == task)906 if (owner == task)
909 return -EDEADLK;907 return -EDEADLK;
910 908
911 raw_spin_lock_irqsave(&task->pi_lock, flags);909 raw_spin_lock(&task->pi_lock);
912 __rt_mutex_adjust_prio(task);910 __rt_mutex_adjust_prio(task);
913 waiter->task = task;911 waiter->task = task;
914 waiter->lock = lock;912 waiter->lock = lock;
@@ -921,12 +919,12 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 6 unmodified lines
921 919
922 task->pi_blocked_on = waiter;920 task->pi_blocked_on = waiter;
923 921
924 raw_spin_unlock_irqrestore(&task->pi_lock, flags);922 raw_spin_unlock(&task->pi_lock);
925 923
926 if (!owner)924 if (!owner)
927 return 0;925 return 0;
928 926
929 raw_spin_lock_irqsave(&owner->pi_lock, flags);927 raw_spin_lock(&owner->pi_lock);
930 if (waiter == rt_mutex_top_waiter(lock)) {928 if (waiter == rt_mutex_top_waiter(lock)) {
931 rt_mutex_dequeue_pi(owner, top_waiter);929 rt_mutex_dequeue_pi(owner, top_waiter);
932 rt_mutex_enqueue_pi(owner, waiter);930 rt_mutex_enqueue_pi(owner, waiter);
@@ -941,7 +939,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 8 unmodified lines
941 /* Store the lock on which owner is blocked or NULL */939 /* Store the lock on which owner is blocked or NULL */
942 next_lock = task_blocked_on_lock(owner);940 next_lock = task_blocked_on_lock(owner);
943 941
944 raw_spin_unlock_irqrestore(&owner->pi_lock, flags);942 raw_spin_unlock(&owner->pi_lock);
945 /*943 /*
946 * Even if full deadlock detection is on, if the owner is not944 * Even if full deadlock detection is on, if the owner is not
947 * blocked itself, we can avoid finding this out in the chain945 * blocked itself, we can avoid finding this out in the chain
@@ -957,12 +955,12 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 9 unmodified lines
957 */955 */
958 get_task_struct(owner);956 get_task_struct(owner);
959 957
960 raw_spin_unlock(&lock->wait_lock);958 raw_spin_unlock_irq(&lock->wait_lock);
961 959
962 res = rt_mutex_adjust_prio_chain(owner, chwalk, lock,960 res = rt_mutex_adjust_prio_chain(owner, chwalk, lock,
963 next_lock, waiter, task);961 next_lock, waiter, task);
964 962
965 raw_spin_lock(&lock->wait_lock);963 raw_spin_lock_irq(&lock->wait_lock);
966 964
967 return res;965 return res;
968}966}
@@ -971,15 +969,14 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, · 2 unmodified lines
971 * Remove the top waiter from the current tasks pi waiter tree and969 * Remove the top waiter from the current tasks pi waiter tree and
972 * queue it up.970 * queue it up.
973 *971 *
974 * Called with lock->wait_lock held.972 * Called with lock->wait_lock held and interrupts disabled.
975 */973 */
976static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,974static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
977 struct rt_mutex *lock)975 struct rt_mutex *lock)
978{976{
979 struct rt_mutex_waiter *waiter;977 struct rt_mutex_waiter *waiter;
980 unsigned long flags;
981 978
982 raw_spin_lock_irqsave(&current->pi_lock, flags);979 raw_spin_lock(&current->pi_lock);
983 980
984 waiter = rt_mutex_top_waiter(lock);981 waiter = rt_mutex_top_waiter(lock);
985 982
@@ -1001,7 +998,7 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, · 15 unmodified lines
1001 */998 */
1002 lock->owner = (void *) RT_MUTEX_HAS_WAITERS;999 lock->owner = (void *) RT_MUTEX_HAS_WAITERS;
1003 1000
1004 raw_spin_unlock_irqrestore(&current->pi_lock, flags);1001 raw_spin_unlock(&current->pi_lock);
1005 1002
1006 wake_q_add(wake_q, waiter->task);1003 wake_q_add(wake_q, waiter->task);
1007}1004}
@@ -1009,7 +1006,7 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, · 1 unmodified line
1009/*1006/*
1010 * Remove a waiter from a lock and give up1007 * Remove a waiter from a lock and give up
1011 *1008 *
1012 * Must be called with lock->wait_lock held and1009 * Must be called with lock->wait_lock held and interrupts disabled. I must
1013 * have just failed to try_to_take_rt_mutex().1010 * have just failed to try_to_take_rt_mutex().
1014 */1011 */
1015static void remove_waiter(struct rt_mutex *lock,1012static void remove_waiter(struct rt_mutex *lock,
@@ -1018,12 +1015,11 @@ static void remove_waiter(struct rt_mutex *lock, · 2 unmodified lines
1018 bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));1015 bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
1019 struct task_struct *owner = rt_mutex_owner(lock);1016 struct task_struct *owner = rt_mutex_owner(lock);
1020 struct rt_mutex *next_lock;1017 struct rt_mutex *next_lock;
1021 unsigned long flags;
1022 1018
1023 raw_spin_lock_irqsave(&current->pi_lock, flags);1019 raw_spin_lock(&current->pi_lock);
1024 rt_mutex_dequeue(lock, waiter);1020 rt_mutex_dequeue(lock, waiter);
1025 current->pi_blocked_on = NULL;1021 current->pi_blocked_on = NULL;
1026 raw_spin_unlock_irqrestore(&current->pi_lock, flags);1022 raw_spin_unlock(&current->pi_lock);
1027 1023
1028 /*1024 /*
1029 * Only update priority if the waiter was the highest priority1025 * Only update priority if the waiter was the highest priority
@@ -1032,7 +1028,7 @@ static void remove_waiter(struct rt_mutex *lock, · 2 unmodified lines
1032 if (!owner || !is_top_waiter)1028 if (!owner || !is_top_waiter)
1033 return;1029 return;
1034 1030
1035 raw_spin_lock_irqsave(&owner->pi_lock, flags);1031 raw_spin_lock(&owner->pi_lock);
1036 1032
1037 rt_mutex_dequeue_pi(owner, waiter);1033 rt_mutex_dequeue_pi(owner, waiter);
1038 1034
@@ -1044,7 +1040,7 @@ static void remove_waiter(struct rt_mutex *lock, · 5 unmodified lines
1044 /* Store the lock on which owner is blocked or NULL */1040 /* Store the lock on which owner is blocked or NULL */
1045 next_lock = task_blocked_on_lock(owner);1041 next_lock = task_blocked_on_lock(owner);
1046 1042
1047 raw_spin_unlock_irqrestore(&owner->pi_lock, flags);1043 raw_spin_unlock(&owner->pi_lock);
1048 1044
1049 /*1045 /*
1050 * Don't walk the chain, if the owner task is not blocked1046 * Don't walk the chain, if the owner task is not blocked
@@ -1056,12 +1052,12 @@ static void remove_waiter(struct rt_mutex *lock, · 5 unmodified lines
1056 /* gets dropped in rt_mutex_adjust_prio_chain()! */1052 /* gets dropped in rt_mutex_adjust_prio_chain()! */
1057 get_task_struct(owner);1053 get_task_struct(owner);
1058 1054
1059 raw_spin_unlock(&lock->wait_lock);1055 raw_spin_unlock_irq(&lock->wait_lock);
1060 1056
1061 rt_mutex_adjust_prio_chain(owner, RT_MUTEX_MIN_CHAINWALK, lock,1057 rt_mutex_adjust_prio_chain(owner, RT_MUTEX_MIN_CHAINWALK, lock,
1062 next_lock, NULL, current);1058 next_lock, NULL, current);
1063 1059
1064 raw_spin_lock(&lock->wait_lock);1060 raw_spin_lock_irq(&lock->wait_lock);
1065}1061}
1066 1062
1067/*1063/*
@@ -1097,11 +1093,11 @@ void rt_mutex_adjust_pi(struct task_struct *task) · 29 unmodified lines
1097 * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop1093 * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop
1098 * @lock: the rt_mutex to take1094 * @lock: the rt_mutex to take
1099 * @state: the state the task should block in (TASK_INTERRUPTIBLE1095 * @state: the state the task should block in (TASK_INTERRUPTIBLE
1100 * or TASK_UNINTERRUPTIBLE)1096 * or TASK_UNINTERRUPTIBLE)
1101 * @timeout: the pre-initialized and started timer, or NULL for none1097 * @timeout: the pre-initialized and started timer, or NULL for none
1102 * @waiter: the pre-initialized rt_mutex_waiter1098 * @waiter: the pre-initialized rt_mutex_waiter
1103 *1099 *
1104 * lock->wait_lock must be held by the caller.1100 * Must be called with lock->wait_lock held and interrupts disabled
1105 */1101 */
1106static int __sched1102static int __sched
1107__rt_mutex_slowlock(struct rt_mutex *lock, int state,1103__rt_mutex_slowlock(struct rt_mutex *lock, int state,
@@ -1129,13 +1125,13 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, · 21 unmodified lines
1129 break;1125 break;
1130 }1126 }
1131 1127
1132 raw_spin_unlock(&lock->wait_lock);1128 raw_spin_unlock_irq(&lock->wait_lock);
1133 1129
1134 debug_rt_mutex_print_deadlock(waiter);1130 debug_rt_mutex_print_deadlock(waiter);
1135 1131
1136 schedule();1132 schedule();
1137 1133
1138 raw_spin_lock(&lock->wait_lock);1134 raw_spin_lock_irq(&lock->wait_lock);
1139 set_current_state(state);1135 set_current_state(state);
1140 }1136 }
1141 1137
@@ -1172,17 +1168,26 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, · 30 unmodified lines
1172 enum rtmutex_chainwalk chwalk)1168 enum rtmutex_chainwalk chwalk)
1173{1169{
1174 struct rt_mutex_waiter waiter;1170 struct rt_mutex_waiter waiter;
1171 unsigned long flags;
1175 int ret = 0;1172 int ret = 0;
1176 1173
1177 debug_rt_mutex_init_waiter(&waiter);1174 debug_rt_mutex_init_waiter(&waiter);
1178 RB_CLEAR_NODE(&waiter.pi_tree_entry);1175 RB_CLEAR_NODE(&waiter.pi_tree_entry);
1179 RB_CLEAR_NODE(&waiter.tree_entry);1176 RB_CLEAR_NODE(&waiter.tree_entry);
1180 1177
1181 raw_spin_lock(&lock->wait_lock);1178 /*
1179 * Technically we could use raw_spin_[un]lock_irq() here, but this can
1180 * be called in early boot if the cmpxchg() fast path is disabled
1181 * (debug, no architecture support). In this case we will acquire the
1182 * rtmutex with lock->wait_lock held. But we cannot unconditionally
1183 * enable interrupts in that early boot case. So we need to use the
1184 * irqsave/restore variants.
1185 */
1186 raw_spin_lock_irqsave(&lock->wait_lock, flags);
1182 1187
1183 /* Try to acquire the lock again: */1188 /* Try to acquire the lock again: */
1184 if (try_to_take_rt_mutex(lock, current, NULL)) {1189 if (try_to_take_rt_mutex(lock, current, NULL)) {
1185 raw_spin_unlock(&lock->wait_lock);1190 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
1186 return 0;1191 return 0;
1187 }1192 }
1188 1193
@@ -1211,7 +1216,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, · 22 unmodified lines
1211 */1216 */
1212 fixup_rt_mutex_waiters(lock);1217 fixup_rt_mutex_waiters(lock);
1213 1218
1214 raw_spin_unlock(&lock->wait_lock);1219 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
1215 1220
1216 /* Remove pending timer: */1221 /* Remove pending timer: */
1217 if (unlikely(timeout))1222 if (unlikely(timeout))
@@ -1227,6 +1232,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, · 9 unmodified lines
1227 */1232 */
1228static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)1233static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
1229{1234{
1235 unsigned long flags;
1230 int ret;1236 int ret;
1231 1237
1232 /*1238 /*
@@ -1238,10 +1244,10 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) · 5 unmodified lines
1238 return 0;1244 return 0;
1239 1245
1240 /*1246 /*
1241 * The mutex has currently no owner. Lock the wait lock and1247 * The mutex has currently no owner. Lock the wait lock and try to
1242 * try to acquire the lock.1248 * acquire the lock. We use irqsave here to support early boot calls.
1243 */1249 */
1244 raw_spin_lock(&lock->wait_lock);1250 raw_spin_lock_irqsave(&lock->wait_lock, flags);
1245 1251
1246 ret = try_to_take_rt_mutex(lock, current, NULL);1252 ret = try_to_take_rt_mutex(lock, current, NULL);
1247 1253
@@ -1251,7 +1257,7 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) · 3 unmodified lines
1251 */1257 */
1252 fixup_rt_mutex_waiters(lock);1258 fixup_rt_mutex_waiters(lock);
1253 1259
1254 raw_spin_unlock(&lock->wait_lock);1260 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
1255 1261
1256 return ret;1262 return ret;
1257}1263}
@@ -1263,7 +1269,10 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) · 5 unmodified lines
1263static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,1269static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
1264 struct wake_q_head *wake_q)1270 struct wake_q_head *wake_q)
1265{1271{
1266 raw_spin_lock(&lock->wait_lock);1272 unsigned long flags;
1273
1274 /* irqsave required to support early boot calls */
1275 raw_spin_lock_irqsave(&lock->wait_lock, flags);
1267 1276
1268 debug_rt_mutex_unlock(lock);1277 debug_rt_mutex_unlock(lock);
1269 1278
@@ -1302,10 +1311,10 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, · 32 unmodified lines
1302 */1311 */
1303 while (!rt_mutex_has_waiters(lock)) {1312 while (!rt_mutex_has_waiters(lock)) {
1304 /* Drops lock->wait_lock ! */1313 /* Drops lock->wait_lock ! */
1305 if (unlock_rt_mutex_safe(lock) == true)1314 if (unlock_rt_mutex_safe(lock, flags) == true)
1306 return false;1315 return false;
1307 /* Relock the rtmutex and try again */1316 /* Relock the rtmutex and try again */
1308 raw_spin_lock(&lock->wait_lock);1317 raw_spin_lock_irqsave(&lock->wait_lock, flags);
1309 }1318 }
1310 1319
1311 /*1320 /*
@@ -1316,7 +1325,7 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, · 4 unmodified lines
1316 */1325 */
1317 mark_wakeup_next_waiter(wake_q, lock);1326 mark_wakeup_next_waiter(wake_q, lock);
1318 1327
1319 raw_spin_unlock(&lock->wait_lock);1328 raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
1320 1329
1321 /* check PI boosting */1330 /* check PI boosting */
1322 return true;1331 return true;
@@ -1596,10 +1605,10 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, · 273 unmodified lines
1596{1605{
1597 int ret;1606 int ret;
1598 1607
1599 raw_spin_lock(&lock->wait_lock);1608 raw_spin_lock_irq(&lock->wait_lock);
1600 1609
1601 if (try_to_take_rt_mutex(lock, task, NULL)) {1610 if (try_to_take_rt_mutex(lock, task, NULL)) {
1602 raw_spin_unlock(&lock->wait_lock);1611 raw_spin_unlock_irq(&lock->wait_lock);
1603 return 1;1612 return 1;
1604 }1613 }
1605 1614
@@ -1620,7 +1629,7 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, · 14 unmodified lines
1620 if (unlikely(ret))1629 if (unlikely(ret))
1621 remove_waiter(lock, waiter);1630 remove_waiter(lock, waiter);
1622 1631
1623 raw_spin_unlock(&lock->wait_lock);1632 raw_spin_unlock_irq(&lock->wait_lock);
1624 1633
1625 debug_rt_mutex_print_deadlock(waiter);1634 debug_rt_mutex_print_deadlock(waiter);
1626 1635
@@ -1668,7 +1677,7 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, · 41 unmodified lines
1668{1677{
1669 int ret;1678 int ret;
1670 1679
1671 raw_spin_lock(&lock->wait_lock);1680 raw_spin_lock_irq(&lock->wait_lock);
1672 1681
1673 set_current_state(TASK_INTERRUPTIBLE);1682 set_current_state(TASK_INTERRUPTIBLE);
1674 1683
@@ -1684,7 +1693,7 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, · 9 unmodified lines
1684 */1693 */
1685 fixup_rt_mutex_waiters(lock);1694 fixup_rt_mutex_waiters(lock);
1686 1695
1687 raw_spin_unlock(&lock->wait_lock);1696 raw_spin_unlock_irq(&lock->wait_lock);
1688 1697
1689 return ret;1698 return ret;
1690}1699}