diff options
| -rw-r--r-- | kernel/futex.c | 18 | ||||
| -rw-r--r-- | kernel/locking/rtmutex.c | 135 |
2 files changed, 81 insertions, 72 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index 0773f2b23b10..5d6ce6413ef1 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -1191,7 +1191,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this, | |||
| 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, | |||
| 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) | |||
| 2127 | * we returned due to timeout or signal without taking the | 2127 | * 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 | } |
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 8251e75dd9c0..3e746607abe5 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c | |||
| @@ -99,13 +99,14 @@ static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) | |||
| 99 | * 2) Drop lock->wait_lock | 99 | * 2) Drop lock->wait_lock |
| 100 | * 3) Try to unlock the lock with cmpxchg | 100 | * 3) Try to unlock the lock with cmpxchg |
| 101 | */ | 101 | */ |
| 102 | static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock) | 102 | static 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 cmpxchg | 111 | * 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) | |||
| 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 | */ |
| 150 | static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock) | 151 | static 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 | #endif | 159 | #endif |
| @@ -433,7 +435,6 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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 stored | 730 | * 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, | |||
| 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, | |||
| 756 | /* | 757 | /* |
| 757 | * Try to take an rt-mutex | 758 | * 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 lock | 763 | * @task: The task which wants to acquire the lock |
| @@ -766,8 +767,6 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, | |||
| 766 | static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, | 767 | static 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 the | 771 | * Before testing whether we can acquire @lock, we set the |
| 773 | * RT_MUTEX_HAS_WAITERS bit in @lock->owner. This forces all | 772 | * 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, | |||
| 852 | * case, but conditionals are more expensive than a redundant | 851 | * 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. If | 857 | * 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, | |||
| 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 | ||
| 866 | takeit: | 865 | takeit: |
| 867 | /* We got the lock. */ | 866 | /* We got the lock. */ |
| @@ -883,7 +882,7 @@ takeit: | |||
| 883 | * | 882 | * |
| 884 | * Prepare waiter and propagate pi chain | 883 | * 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 | */ |
| 888 | static int task_blocks_on_rt_mutex(struct rt_mutex *lock, | 887 | static 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, | |||
| 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 to | 898 | * 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, | |||
| 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, | |||
| 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, | |||
| 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 not | 944 | * Even if full deadlock detection is on, if the owner is not |
| 947 | * blocked itself, we can avoid finding this out in the chain | 945 | * 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, | |||
| 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, | |||
| 971 | * Remove the top waiter from the current tasks pi waiter tree and | 969 | * 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 | */ |
| 976 | static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, | 974 | static 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(¤t->pi_lock, flags); | 979 | raw_spin_lock(¤t->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, | |||
| 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(¤t->pi_lock, flags); | 1001 | raw_spin_unlock(¤t->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, | |||
| 1009 | /* | 1006 | /* |
| 1010 | * Remove a waiter from a lock and give up | 1007 | * Remove a waiter from a lock and give up |
| 1011 | * | 1008 | * |
| 1012 | * Must be called with lock->wait_lock held and | 1009 | * 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 | */ |
| 1015 | static void remove_waiter(struct rt_mutex *lock, | 1012 | static void remove_waiter(struct rt_mutex *lock, |
| @@ -1018,12 +1015,11 @@ static void remove_waiter(struct rt_mutex *lock, | |||
| 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(¤t->pi_lock, flags); | 1019 | raw_spin_lock(¤t->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(¤t->pi_lock, flags); | 1022 | raw_spin_unlock(¤t->pi_lock); |
| 1027 | 1023 | ||
| 1028 | /* | 1024 | /* |
| 1029 | * Only update priority if the waiter was the highest priority | 1025 | * Only update priority if the waiter was the highest priority |
| @@ -1032,7 +1028,7 @@ static void remove_waiter(struct rt_mutex *lock, | |||
| 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, | |||
| 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 blocked | 1046 | * Don't walk the chain, if the owner task is not blocked |
| @@ -1056,12 +1052,12 @@ static void remove_waiter(struct rt_mutex *lock, | |||
| 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) | |||
| 1097 | * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop | 1093 | * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop |
| 1098 | * @lock: the rt_mutex to take | 1094 | * @lock: the rt_mutex to take |
| 1099 | * @state: the state the task should block in (TASK_INTERRUPTIBLE | 1095 | * @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 none | 1097 | * @timeout: the pre-initialized and started timer, or NULL for none |
| 1102 | * @waiter: the pre-initialized rt_mutex_waiter | 1098 | * @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 | */ |
| 1106 | static int __sched | 1102 | static 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 1227 | */ | 1232 | */ |
| 1228 | static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) | 1233 | static 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) | |||
| 1238 | return 0; | 1244 | return 0; |
| 1239 | 1245 | ||
| 1240 | /* | 1246 | /* |
| 1241 | * The mutex has currently no owner. Lock the wait lock and | 1247 | * 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) | |||
| 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) | |||
| 1263 | static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, | 1269 | static 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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, | |||
| 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 | } |
