@@ -219,7 +219,7 @@ static void regulator_lock_two(struct regulator_dev *rdev1,
219
219
struct regulator_dev * rdev2 ,
220
220
struct ww_acquire_ctx * ww_ctx )
221
221
{
222
- struct regulator_dev * tmp ;
222
+ struct regulator_dev * held , * contended ;
223
223
int ret ;
224
224
225
225
ww_acquire_init (ww_ctx , & regulator_ww_class );
@@ -233,25 +233,18 @@ static void regulator_lock_two(struct regulator_dev *rdev1,
233
233
goto exit ;
234
234
}
235
235
236
+ held = rdev1 ;
237
+ contended = rdev2 ;
236
238
while (true) {
237
- /*
238
- * Start of loop: rdev1 was locked and rdev2 was contended.
239
- * Need to unlock rdev1, slowly lock rdev2, then try rdev1
240
- * again.
241
- */
242
- regulator_unlock (rdev1 );
243
-
244
- ww_mutex_lock_slow (& rdev2 -> mutex , ww_ctx );
245
- rdev2 -> ref_cnt ++ ;
246
- rdev2 -> mutex_owner = current ;
247
- ret = regulator_lock_nested (rdev1 , ww_ctx );
248
-
249
- if (ret == - EDEADLOCK ) {
250
- /* More contention; swap which needs to be slow */
251
- tmp = rdev1 ;
252
- rdev1 = rdev2 ;
253
- rdev2 = tmp ;
254
- } else {
239
+ regulator_unlock (held );
240
+
241
+ ww_mutex_lock_slow (& contended -> mutex , ww_ctx );
242
+ contended -> ref_cnt ++ ;
243
+ contended -> mutex_owner = current ;
244
+ swap (held , contended );
245
+ ret = regulator_lock_nested (contended , ww_ctx );
246
+
247
+ if (ret != - EDEADLOCK ) {
255
248
WARN_ON (ret );
256
249
break ;
257
250
}
0 commit comments