@@ -382,6 +382,7 @@ static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
382382
383383bool mlx5_wc_support_get (struct mlx5_core_dev * mdev )
384384{
385+ struct mutex * wc_state_lock = & mdev -> wc_state_lock ;
385386 struct mlx5_core_dev * parent = NULL ;
386387
387388 if (!MLX5_CAP_GEN (mdev , bf )) {
@@ -400,32 +401,31 @@ bool mlx5_wc_support_get(struct mlx5_core_dev *mdev)
400401 */
401402 goto out ;
402403
403- mutex_lock (& mdev -> wc_state_lock );
404-
405- if (mdev -> wc_state != MLX5_WC_STATE_UNINITIALIZED )
406- goto unlock ;
407-
408404#ifdef CONFIG_MLX5_SF
409- if (mlx5_core_is_sf (mdev ))
405+ if (mlx5_core_is_sf (mdev )) {
410406 parent = mdev -> priv .parent_mdev ;
407+ wc_state_lock = & parent -> wc_state_lock ;
408+ }
411409#endif
412410
413- if (parent ) {
414- mutex_lock (& parent -> wc_state_lock );
411+ mutex_lock (wc_state_lock );
415412
413+ if (mdev -> wc_state != MLX5_WC_STATE_UNINITIALIZED )
414+ goto unlock ;
415+
416+ if (parent ) {
416417 mlx5_core_test_wc (parent );
417418
418419 mlx5_core_dbg (mdev , "parent set wc_state=%d\n" ,
419420 parent -> wc_state );
420421 mdev -> wc_state = parent -> wc_state ;
421422
422- mutex_unlock (& parent -> wc_state_lock );
423+ } else {
424+ mlx5_core_test_wc (mdev );
423425 }
424426
425- mlx5_core_test_wc (mdev );
426-
427427unlock :
428- mutex_unlock (& mdev -> wc_state_lock );
428+ mutex_unlock (wc_state_lock );
429429out :
430430 mlx5_core_dbg (mdev , "wc_state=%d\n" , mdev -> wc_state );
431431
0 commit comments