@@ -382,6 +382,7 @@ static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
382
382
383
383
bool mlx5_wc_support_get (struct mlx5_core_dev * mdev )
384
384
{
385
+ struct mutex * wc_state_lock = & mdev -> wc_state_lock ;
385
386
struct mlx5_core_dev * parent = NULL ;
386
387
387
388
if (!MLX5_CAP_GEN (mdev , bf )) {
@@ -400,32 +401,31 @@ bool mlx5_wc_support_get(struct mlx5_core_dev *mdev)
400
401
*/
401
402
goto out ;
402
403
403
- mutex_lock (& mdev -> wc_state_lock );
404
-
405
- if (mdev -> wc_state != MLX5_WC_STATE_UNINITIALIZED )
406
- goto unlock ;
407
-
408
404
#ifdef CONFIG_MLX5_SF
409
- if (mlx5_core_is_sf (mdev ))
405
+ if (mlx5_core_is_sf (mdev )) {
410
406
parent = mdev -> priv .parent_mdev ;
407
+ wc_state_lock = & parent -> wc_state_lock ;
408
+ }
411
409
#endif
412
410
413
- if (parent ) {
414
- mutex_lock (& parent -> wc_state_lock );
411
+ mutex_lock (wc_state_lock );
415
412
413
+ if (mdev -> wc_state != MLX5_WC_STATE_UNINITIALIZED )
414
+ goto unlock ;
415
+
416
+ if (parent ) {
416
417
mlx5_core_test_wc (parent );
417
418
418
419
mlx5_core_dbg (mdev , "parent set wc_state=%d\n" ,
419
420
parent -> wc_state );
420
421
mdev -> wc_state = parent -> wc_state ;
421
422
422
- mutex_unlock (& parent -> wc_state_lock );
423
+ } else {
424
+ mlx5_core_test_wc (mdev );
423
425
}
424
426
425
- mlx5_core_test_wc (mdev );
426
-
427
427
unlock :
428
- mutex_unlock (& mdev -> wc_state_lock );
428
+ mutex_unlock (wc_state_lock );
429
429
out :
430
430
mlx5_core_dbg (mdev , "wc_state=%d\n" , mdev -> wc_state );
431
431
0 commit comments