diff options
Diffstat (limited to 'kernel/locking/rwsem.c')
-rw-r--r-- | kernel/locking/rwsem.c | 13 |
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; |