@@ -1004,6 +1004,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
1004
1004
atomic_long_add (- RWSEM_READER_BIAS , & sem -> count );
1005
1005
adjustment = 0 ;
1006
1006
if (rwsem_optimistic_spin (sem , false)) {
1007
+ /* rwsem_optimistic_spin() implies ACQUIRE on success */
1007
1008
/*
1008
1009
* Wake up other readers in the wait list if the front
1009
1010
* waiter is a reader.
@@ -1018,6 +1019,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
1018
1019
}
1019
1020
return sem ;
1020
1021
} else if (rwsem_reader_phase_trylock (sem , waiter .last_rowner )) {
1022
+ /* rwsem_reader_phase_trylock() implies ACQUIRE on success */
1021
1023
return sem ;
1022
1024
}
1023
1025
@@ -1071,17 +1073,18 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
1071
1073
wake_up_q (& wake_q );
1072
1074
1073
1075
/* wait to be given the lock */
1074
- while (true ) {
1076
+ for (;; ) {
1075
1077
set_current_state (state );
1076
1078
if (!smp_load_acquire (& waiter .task )) {
1077
- /* Orders against rwsem_mark_wake()'s smp_store_release() */
1079
+ /* Matches rwsem_mark_wake()'s smp_store_release(). */
1078
1080
break ;
1079
1081
}
1080
1082
if (signal_pending_state (state , current )) {
1081
1083
raw_spin_lock_irq (& sem -> wait_lock );
1082
1084
if (waiter .task )
1083
1085
goto out_nolock ;
1084
1086
raw_spin_unlock_irq (& sem -> wait_lock );
1087
+ /* Ordered by sem->wait_lock against rwsem_mark_wake(). */
1085
1088
break ;
1086
1089
}
1087
1090
schedule ();
@@ -1091,6 +1094,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
1091
1094
__set_current_state (TASK_RUNNING );
1092
1095
lockevent_inc (rwsem_rlock );
1093
1096
return sem ;
1097
+
1094
1098
out_nolock :
1095
1099
list_del (& waiter .list );
1096
1100
if (list_empty (& sem -> wait_list )) {
@@ -1131,8 +1135,10 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
1131
1135
1132
1136
/* do optimistic spinning and steal lock if possible */
1133
1137
if (rwsem_can_spin_on_owner (sem , RWSEM_WR_NONSPINNABLE ) &&
1134
- rwsem_optimistic_spin (sem , true))
1138
+ rwsem_optimistic_spin (sem , true)) {
1139
+ /* rwsem_optimistic_spin() implies ACQUIRE on success */
1135
1140
return sem ;
1141
+ }
1136
1142
1137
1143
/*
1138
1144
* Disable reader optimistic spinning for this rwsem after
@@ -1192,9 +1198,11 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
1192
1198
wait :
1193
1199
/* wait until we successfully acquire the lock */
1194
1200
set_current_state (state );
1195
- while (true) {
1196
- if (rwsem_try_write_lock (sem , wstate ))
1201
+ for (;;) {
1202
+ if (rwsem_try_write_lock (sem , wstate )) {
1203
+ /* rwsem_try_write_lock() implies ACQUIRE on success */
1197
1204
break ;
1205
+ }
1198
1206
1199
1207
raw_spin_unlock_irq (& sem -> wait_lock );
1200
1208
0 commit comments