@@ -80,8 +80,11 @@ const char *__attribute_const__ ibcm_reject_msg(int reason)
80
80
}
81
81
EXPORT_SYMBOL (ibcm_reject_msg );
82
82
83
+ struct cm_id_private ;
83
84
static void cm_add_one (struct ib_device * device );
84
85
static void cm_remove_one (struct ib_device * device , void * client_data );
86
+ static int cm_send_dreq_locked (struct cm_id_private * cm_id_priv ,
87
+ const void * private_data , u8 private_data_len );
85
88
86
89
static struct ib_client cm_client = {
87
90
.name = "cm" ,
@@ -1084,10 +1087,12 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
1084
1087
NULL , 0 , NULL , 0 );
1085
1088
break ;
1086
1089
case IB_CM_ESTABLISHED :
1087
- spin_unlock_irq ( & cm_id_priv -> lock );
1088
- if ( cm_id_priv -> qp_type == IB_QPT_XRC_TGT )
1090
+ if ( cm_id_priv -> qp_type == IB_QPT_XRC_TGT ) {
1091
+ spin_unlock_irq ( & cm_id_priv -> lock );
1089
1092
break ;
1090
- ib_send_cm_dreq (cm_id , NULL , 0 );
1093
+ }
1094
+ cm_send_dreq_locked (cm_id_priv , NULL , 0 );
1095
+ spin_unlock_irq (& cm_id_priv -> lock );
1091
1096
goto retest ;
1092
1097
case IB_CM_DREQ_SENT :
1093
1098
ib_cancel_mad (cm_id_priv -> av .port -> mad_agent , cm_id_priv -> msg );
@@ -2604,35 +2609,32 @@ static void cm_format_dreq(struct cm_dreq_msg *dreq_msg,
2604
2609
private_data_len );
2605
2610
}
2606
2611
2607
- int ib_send_cm_dreq (struct ib_cm_id * cm_id ,
2608
- const void * private_data ,
2609
- u8 private_data_len )
2612
+ static int cm_send_dreq_locked (struct cm_id_private * cm_id_priv ,
2613
+ const void * private_data , u8 private_data_len )
2610
2614
{
2611
- struct cm_id_private * cm_id_priv ;
2612
2615
struct ib_mad_send_buf * msg ;
2613
- unsigned long flags ;
2614
2616
int ret ;
2615
2617
2618
+ lockdep_assert_held (& cm_id_priv -> lock );
2619
+
2616
2620
if (private_data && private_data_len > IB_CM_DREQ_PRIVATE_DATA_SIZE )
2617
2621
return - EINVAL ;
2618
2622
2619
- cm_id_priv = container_of (cm_id , struct cm_id_private , id );
2620
- spin_lock_irqsave (& cm_id_priv -> lock , flags );
2621
- if (cm_id -> state != IB_CM_ESTABLISHED ) {
2623
+ if (cm_id_priv -> id .state != IB_CM_ESTABLISHED ) {
2622
2624
pr_debug ("%s: local_id %d, cm_id->state: %d\n" , __func__ ,
2623
- be32_to_cpu (cm_id -> local_id ), cm_id -> state );
2624
- ret = - EINVAL ;
2625
- goto out ;
2625
+ be32_to_cpu (cm_id_priv -> id . local_id ),
2626
+ cm_id_priv -> id . state ) ;
2627
+ return - EINVAL ;
2626
2628
}
2627
2629
2628
- if (cm_id -> lap_state == IB_CM_LAP_SENT ||
2629
- cm_id -> lap_state == IB_CM_MRA_LAP_RCVD )
2630
+ if (cm_id_priv -> id . lap_state == IB_CM_LAP_SENT ||
2631
+ cm_id_priv -> id . lap_state == IB_CM_MRA_LAP_RCVD )
2630
2632
ib_cancel_mad (cm_id_priv -> av .port -> mad_agent , cm_id_priv -> msg );
2631
2633
2632
2634
ret = cm_alloc_msg (cm_id_priv , & msg );
2633
2635
if (ret ) {
2634
2636
cm_enter_timewait (cm_id_priv );
2635
- goto out ;
2637
+ return ret ;
2636
2638
}
2637
2639
2638
2640
cm_format_dreq ((struct cm_dreq_msg * ) msg -> mad , cm_id_priv ,
@@ -2643,14 +2645,26 @@ int ib_send_cm_dreq(struct ib_cm_id *cm_id,
2643
2645
ret = ib_post_send_mad (msg , NULL );
2644
2646
if (ret ) {
2645
2647
cm_enter_timewait (cm_id_priv );
2646
- spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2647
2648
cm_free_msg (msg );
2648
2649
return ret ;
2649
2650
}
2650
2651
2651
- cm_id -> state = IB_CM_DREQ_SENT ;
2652
+ cm_id_priv -> id . state = IB_CM_DREQ_SENT ;
2652
2653
cm_id_priv -> msg = msg ;
2653
- out : spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2654
+ return 0 ;
2655
+ }
2656
+
2657
+ int ib_send_cm_dreq (struct ib_cm_id * cm_id , const void * private_data ,
2658
+ u8 private_data_len )
2659
+ {
2660
+ struct cm_id_private * cm_id_priv =
2661
+ container_of (cm_id , struct cm_id_private , id );
2662
+ unsigned long flags ;
2663
+ int ret ;
2664
+
2665
+ spin_lock_irqsave (& cm_id_priv -> lock , flags );
2666
+ ret = cm_send_dreq_locked (cm_id_priv , private_data , private_data_len );
2667
+ spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2654
2668
return ret ;
2655
2669
}
2656
2670
EXPORT_SYMBOL (ib_send_cm_dreq );
0 commit comments