@@ -113,6 +113,10 @@ static int cm_send_dreq_locked(struct cm_id_private *cm_id_priv,
113
113
const void * private_data , u8 private_data_len );
114
114
static int cm_send_drep_locked (struct cm_id_private * cm_id_priv ,
115
115
void * private_data , u8 private_data_len );
116
+ static int cm_send_rej_locked (struct cm_id_private * cm_id_priv ,
117
+ enum ib_cm_rej_reason reason , void * ari ,
118
+ u8 ari_length , const void * private_data ,
119
+ u8 private_data_len );
116
120
117
121
static struct ib_client cm_client = {
118
122
.name = "cm" ,
@@ -1057,21 +1061,22 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
1057
1061
case IB_CM_REQ_SENT :
1058
1062
case IB_CM_MRA_REQ_RCVD :
1059
1063
ib_cancel_mad (cm_id_priv -> av .port -> mad_agent , cm_id_priv -> msg );
1064
+ cm_send_rej_locked (cm_id_priv , IB_CM_REJ_TIMEOUT ,
1065
+ & cm_id_priv -> id .device -> node_guid ,
1066
+ sizeof (cm_id_priv -> id .device -> node_guid ),
1067
+ NULL , 0 );
1060
1068
spin_unlock_irq (& cm_id_priv -> lock );
1061
- ib_send_cm_rej (cm_id , IB_CM_REJ_TIMEOUT ,
1062
- & cm_id_priv -> id .device -> node_guid ,
1063
- sizeof cm_id_priv -> id .device -> node_guid ,
1064
- NULL , 0 );
1065
1069
break ;
1066
1070
case IB_CM_REQ_RCVD :
1067
1071
if (err == - ENOMEM ) {
1068
1072
/* Do not reject to allow future retries. */
1069
1073
cm_reset_to_idle (cm_id_priv );
1070
1074
spin_unlock_irq (& cm_id_priv -> lock );
1071
1075
} else {
1076
+ cm_send_rej_locked (cm_id_priv ,
1077
+ IB_CM_REJ_CONSUMER_DEFINED , NULL , 0 ,
1078
+ NULL , 0 );
1072
1079
spin_unlock_irq (& cm_id_priv -> lock );
1073
- ib_send_cm_rej (cm_id , IB_CM_REJ_CONSUMER_DEFINED ,
1074
- NULL , 0 , NULL , 0 );
1075
1080
}
1076
1081
break ;
1077
1082
case IB_CM_REP_SENT :
@@ -1081,9 +1086,9 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
1081
1086
case IB_CM_MRA_REQ_SENT :
1082
1087
case IB_CM_REP_RCVD :
1083
1088
case IB_CM_MRA_REP_SENT :
1089
+ cm_send_rej_locked (cm_id_priv , IB_CM_REJ_CONSUMER_DEFINED , NULL ,
1090
+ 0 , NULL , 0 );
1084
1091
spin_unlock_irq (& cm_id_priv -> lock );
1085
- ib_send_cm_rej (cm_id , IB_CM_REJ_CONSUMER_DEFINED ,
1086
- NULL , 0 , NULL , 0 );
1087
1092
break ;
1088
1093
case IB_CM_ESTABLISHED :
1089
1094
if (cm_id_priv -> qp_type == IB_QPT_XRC_TGT ) {
@@ -2773,65 +2778,72 @@ static int cm_drep_handler(struct cm_work *work)
2773
2778
return - EINVAL ;
2774
2779
}
2775
2780
2776
- int ib_send_cm_rej (struct ib_cm_id * cm_id ,
2777
- enum ib_cm_rej_reason reason ,
2778
- void * ari ,
2779
- u8 ari_length ,
2780
- const void * private_data ,
2781
- u8 private_data_len )
2781
+ static int cm_send_rej_locked (struct cm_id_private * cm_id_priv ,
2782
+ enum ib_cm_rej_reason reason , void * ari ,
2783
+ u8 ari_length , const void * private_data ,
2784
+ u8 private_data_len )
2782
2785
{
2783
- struct cm_id_private * cm_id_priv ;
2784
2786
struct ib_mad_send_buf * msg ;
2785
- unsigned long flags ;
2786
2787
int ret ;
2787
2788
2789
+ lockdep_assert_held (& cm_id_priv -> lock );
2790
+
2788
2791
if ((private_data && private_data_len > IB_CM_REJ_PRIVATE_DATA_SIZE ) ||
2789
2792
(ari && ari_length > IB_CM_REJ_ARI_LENGTH ))
2790
2793
return - EINVAL ;
2791
2794
2792
- cm_id_priv = container_of (cm_id , struct cm_id_private , id );
2793
-
2794
- spin_lock_irqsave (& cm_id_priv -> lock , flags );
2795
- switch (cm_id -> state ) {
2795
+ switch (cm_id_priv -> id .state ) {
2796
2796
case IB_CM_REQ_SENT :
2797
2797
case IB_CM_MRA_REQ_RCVD :
2798
2798
case IB_CM_REQ_RCVD :
2799
2799
case IB_CM_MRA_REQ_SENT :
2800
2800
case IB_CM_REP_RCVD :
2801
2801
case IB_CM_MRA_REP_SENT :
2802
- ret = cm_alloc_msg (cm_id_priv , & msg );
2803
- if (!ret )
2804
- cm_format_rej ((struct cm_rej_msg * ) msg -> mad ,
2805
- cm_id_priv , reason , ari , ari_length ,
2806
- private_data , private_data_len );
2807
-
2808
2802
cm_reset_to_idle (cm_id_priv );
2803
+ ret = cm_alloc_msg (cm_id_priv , & msg );
2804
+ if (ret )
2805
+ return ret ;
2806
+ cm_format_rej ((struct cm_rej_msg * )msg -> mad , cm_id_priv , reason ,
2807
+ ari , ari_length , private_data , private_data_len );
2809
2808
break ;
2810
2809
case IB_CM_REP_SENT :
2811
2810
case IB_CM_MRA_REP_RCVD :
2812
- ret = cm_alloc_msg (cm_id_priv , & msg );
2813
- if (!ret )
2814
- cm_format_rej ((struct cm_rej_msg * ) msg -> mad ,
2815
- cm_id_priv , reason , ari , ari_length ,
2816
- private_data , private_data_len );
2817
-
2818
2811
cm_enter_timewait (cm_id_priv );
2812
+ ret = cm_alloc_msg (cm_id_priv , & msg );
2813
+ if (ret )
2814
+ return ret ;
2815
+ cm_format_rej ((struct cm_rej_msg * )msg -> mad , cm_id_priv , reason ,
2816
+ ari , ari_length , private_data , private_data_len );
2819
2817
break ;
2820
2818
default :
2821
2819
pr_debug ("%s: local_id %d, cm_id->state: %d\n" , __func__ ,
2822
- be32_to_cpu (cm_id_priv -> id .local_id ), cm_id -> state );
2823
- ret = - EINVAL ;
2824
- goto out ;
2820
+ be32_to_cpu (cm_id_priv -> id .local_id ),
2821
+ cm_id_priv -> id . state ) ;
2822
+ return - EINVAL ;
2825
2823
}
2826
2824
2827
- if (ret )
2828
- goto out ;
2829
-
2830
2825
ret = ib_post_send_mad (msg , NULL );
2831
- if (ret )
2826
+ if (ret ) {
2832
2827
cm_free_msg (msg );
2828
+ return ret ;
2829
+ }
2833
2830
2834
- out : spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2831
+ return 0 ;
2832
+ }
2833
+
2834
+ int ib_send_cm_rej (struct ib_cm_id * cm_id , enum ib_cm_rej_reason reason ,
2835
+ void * ari , u8 ari_length , const void * private_data ,
2836
+ u8 private_data_len )
2837
+ {
2838
+ struct cm_id_private * cm_id_priv =
2839
+ container_of (cm_id , struct cm_id_private , id );
2840
+ unsigned long flags ;
2841
+ int ret ;
2842
+
2843
+ spin_lock_irqsave (& cm_id_priv -> lock , flags );
2844
+ ret = cm_send_rej_locked (cm_id_priv , reason , ari , ari_length ,
2845
+ private_data , private_data_len );
2846
+ spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2835
2847
return ret ;
2836
2848
}
2837
2849
EXPORT_SYMBOL (ib_send_cm_rej );
0 commit comments