summaryrefslogtreecommitdiffstats
path: root/kernel/locking/rwsem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/locking/rwsem.c')
-rw-r--r--kernel/locking/rwsem.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
index eef04551eae7..9adb95795f83 100644
--- a/kernel/locking/rwsem.c
+++ b/kernel/locking/rwsem.c
@@ -31,6 +31,8 @@
31#include "rwsem.h" 31#include "rwsem.h"
32#include "lock_events.h" 32#include "lock_events.h"
33 33
34#include <litmus/litmus.h>
35
34/* 36/*
35 * The least significant 3 bits of the owner value has the following 37 * The least significant 3 bits of the owner value has the following
36 * meanings when set. 38 * meanings when set.
@@ -886,11 +888,13 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem, bool wlock)
886 * a writer, need_resched() check needs to be done here. 888 * a writer, need_resched() check needs to be done here.
887 */ 889 */
888 if (owner_state != OWNER_WRITER) { 890 if (owner_state != OWNER_WRITER) {
889 if (need_resched()) 891 if (need_resched()) {
890 break; 892 break;
891 if (rt_task(current) && 893 }
892 (prev_owner_state != OWNER_WRITER)) 894 if ((rt_task(current) || is_realtime(current)) &&
895 (prev_owner_state != OWNER_WRITER)) {
893 break; 896 break;
897 }
894 } 898 }
895 prev_owner_state = owner_state; 899 prev_owner_state = owner_state;
896 900
@@ -1258,7 +1262,8 @@ wait:
1258 * until rwsem_try_write_lock() is called. 1262 * until rwsem_try_write_lock() is called.
1259 */ 1263 */
1260 if ((wstate == WRITER_FIRST) && (rt_task(current) || 1264 if ((wstate == WRITER_FIRST) && (rt_task(current) ||
1261 time_after(jiffies, waiter.timeout))) { 1265 is_realtime(current) ||
1266 time_after(jiffies, waiter.timeout))) {
1262 wstate = WRITER_HANDOFF; 1267 wstate = WRITER_HANDOFF;
1263 lockevent_inc(rwsem_wlock_handoff); 1268 lockevent_inc(rwsem_wlock_handoff);
1264 break; 1269 break;