@@ -453,10 +453,8 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
453
453
id_priv -> id .route .addr .dev_addr .transport =
454
454
rdma_node_get_transport (cma_dev -> device -> node_type );
455
455
list_add_tail (& id_priv -> list , & cma_dev -> id_list );
456
- if (id_priv -> res .kern_name )
457
- rdma_restrack_add (& id_priv -> res );
458
- else
459
- rdma_restrack_uadd (& id_priv -> res );
456
+ rdma_restrack_add (& id_priv -> res );
457
+
460
458
trace_cm_id_attach (id_priv , cma_dev -> device );
461
459
}
462
460
@@ -822,10 +820,10 @@ static void cma_id_put(struct rdma_id_private *id_priv)
822
820
complete (& id_priv -> comp );
823
821
}
824
822
825
- struct rdma_cm_id * __rdma_create_id ( struct net * net ,
826
- rdma_cm_event_handler event_handler ,
827
- void * context , enum rdma_ucm_port_space ps ,
828
- enum ib_qp_type qp_type , const char * caller )
823
+ static struct rdma_id_private *
824
+ __rdma_create_id ( struct net * net , rdma_cm_event_handler event_handler ,
825
+ void * context , enum rdma_ucm_port_space ps ,
826
+ enum ib_qp_type qp_type , const struct rdma_id_private * parent )
829
827
{
830
828
struct rdma_id_private * id_priv ;
831
829
@@ -853,11 +851,44 @@ struct rdma_cm_id *__rdma_create_id(struct net *net,
853
851
id_priv -> seq_num &= 0x00ffffff ;
854
852
855
853
rdma_restrack_new (& id_priv -> res , RDMA_RESTRACK_CM_ID );
856
- rdma_restrack_set_task (& id_priv -> res , caller );
854
+ if (parent )
855
+ rdma_restrack_parent_name (& id_priv -> res , & parent -> res );
857
856
858
- return & id_priv -> id ;
857
+ return id_priv ;
858
+ }
859
+
860
+ struct rdma_cm_id *
861
+ __rdma_create_kernel_id (struct net * net , rdma_cm_event_handler event_handler ,
862
+ void * context , enum rdma_ucm_port_space ps ,
863
+ enum ib_qp_type qp_type , const char * caller )
864
+ {
865
+ struct rdma_id_private * ret ;
866
+
867
+ ret = __rdma_create_id (net , event_handler , context , ps , qp_type , NULL );
868
+ if (IS_ERR (ret ))
869
+ return ERR_CAST (ret );
870
+
871
+ rdma_restrack_set_name (& ret -> res , caller );
872
+ return & ret -> id ;
873
+ }
874
+ EXPORT_SYMBOL (__rdma_create_kernel_id );
875
+
876
+ struct rdma_cm_id * rdma_create_user_id (rdma_cm_event_handler event_handler ,
877
+ void * context ,
878
+ enum rdma_ucm_port_space ps ,
879
+ enum ib_qp_type qp_type )
880
+ {
881
+ struct rdma_id_private * ret ;
882
+
883
+ ret = __rdma_create_id (current -> nsproxy -> net_ns , event_handler , context ,
884
+ ps , qp_type , NULL );
885
+ if (IS_ERR (ret ))
886
+ return ERR_CAST (ret );
887
+
888
+ rdma_restrack_set_name (& ret -> res , NULL );
889
+ return & ret -> id ;
859
890
}
860
- EXPORT_SYMBOL (__rdma_create_id );
891
+ EXPORT_SYMBOL (rdma_create_user_id );
861
892
862
893
static int cma_init_ud_qp (struct rdma_id_private * id_priv , struct ib_qp * qp )
863
894
{
@@ -2029,14 +2060,15 @@ cma_ib_new_conn_id(const struct rdma_cm_id *listen_id,
2029
2060
int ret ;
2030
2061
2031
2062
listen_id_priv = container_of (listen_id , struct rdma_id_private , id );
2032
- id = __rdma_create_id (listen_id -> route .addr .dev_addr .net ,
2033
- listen_id -> event_handler , listen_id -> context ,
2034
- listen_id -> ps , ib_event -> param .req_rcvd .qp_type ,
2035
- listen_id_priv -> res .kern_name );
2036
- if (IS_ERR (id ))
2063
+ id_priv = __rdma_create_id (listen_id -> route .addr .dev_addr .net ,
2064
+ listen_id -> event_handler , listen_id -> context ,
2065
+ listen_id -> ps ,
2066
+ ib_event -> param .req_rcvd .qp_type ,
2067
+ listen_id_priv );
2068
+ if (IS_ERR (id_priv ))
2037
2069
return NULL ;
2038
2070
2039
- id_priv = container_of ( id , struct rdma_id_private , id ) ;
2071
+ id = & id_priv -> id ;
2040
2072
if (cma_save_net_info ((struct sockaddr * )& id -> route .addr .src_addr ,
2041
2073
(struct sockaddr * )& id -> route .addr .dst_addr ,
2042
2074
listen_id , ib_event , ss_family , service_id ))
@@ -2090,13 +2122,13 @@ cma_ib_new_udp_id(const struct rdma_cm_id *listen_id,
2090
2122
int ret ;
2091
2123
2092
2124
listen_id_priv = container_of (listen_id , struct rdma_id_private , id );
2093
- id = __rdma_create_id (net , listen_id -> event_handler , listen_id -> context ,
2094
- listen_id -> ps , IB_QPT_UD ,
2095
- listen_id_priv -> res . kern_name );
2096
- if (IS_ERR (id ))
2125
+ id_priv = __rdma_create_id (net , listen_id -> event_handler ,
2126
+ listen_id -> context , listen_id -> ps , IB_QPT_UD ,
2127
+ listen_id_priv );
2128
+ if (IS_ERR (id_priv ))
2097
2129
return NULL ;
2098
2130
2099
- id_priv = container_of ( id , struct rdma_id_private , id ) ;
2131
+ id = & id_priv -> id ;
2100
2132
if (cma_save_net_info ((struct sockaddr * )& id -> route .addr .src_addr ,
2101
2133
(struct sockaddr * )& id -> route .addr .dst_addr ,
2102
2134
listen_id , ib_event , ss_family ,
@@ -2332,7 +2364,6 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
2332
2364
static int iw_conn_req_handler (struct iw_cm_id * cm_id ,
2333
2365
struct iw_cm_event * iw_event )
2334
2366
{
2335
- struct rdma_cm_id * new_cm_id ;
2336
2367
struct rdma_id_private * listen_id , * conn_id ;
2337
2368
struct rdma_cm_event event = {};
2338
2369
int ret = - ECONNABORTED ;
@@ -2352,16 +2383,14 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
2352
2383
goto out ;
2353
2384
2354
2385
/* Create a new RDMA id for the new IW CM ID */
2355
- new_cm_id = __rdma_create_id (listen_id -> id .route .addr .dev_addr .net ,
2356
- listen_id -> id .event_handler ,
2357
- listen_id -> id .context ,
2358
- RDMA_PS_TCP , IB_QPT_RC ,
2359
- listen_id -> res .kern_name );
2360
- if (IS_ERR (new_cm_id )) {
2386
+ conn_id = __rdma_create_id (listen_id -> id .route .addr .dev_addr .net ,
2387
+ listen_id -> id .event_handler ,
2388
+ listen_id -> id .context , RDMA_PS_TCP ,
2389
+ IB_QPT_RC , listen_id );
2390
+ if (IS_ERR (conn_id )) {
2361
2391
ret = - ENOMEM ;
2362
2392
goto out ;
2363
2393
}
2364
- conn_id = container_of (new_cm_id , struct rdma_id_private , id );
2365
2394
mutex_lock_nested (& conn_id -> handler_mutex , SINGLE_DEPTH_NESTING );
2366
2395
conn_id -> state = RDMA_CM_CONNECT ;
2367
2396
@@ -2466,7 +2495,6 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
2466
2495
struct cma_device * cma_dev )
2467
2496
{
2468
2497
struct rdma_id_private * dev_id_priv ;
2469
- struct rdma_cm_id * id ;
2470
2498
struct net * net = id_priv -> id .route .addr .dev_addr .net ;
2471
2499
int ret ;
2472
2500
@@ -2475,13 +2503,12 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
2475
2503
if (cma_family (id_priv ) == AF_IB && !rdma_cap_ib_cm (cma_dev -> device , 1 ))
2476
2504
return ;
2477
2505
2478
- id = __rdma_create_id (net , cma_listen_handler , id_priv , id_priv -> id .ps ,
2479
- id_priv -> id .qp_type , id_priv -> res .kern_name );
2480
- if (IS_ERR (id ))
2506
+ dev_id_priv =
2507
+ __rdma_create_id (net , cma_listen_handler , id_priv ,
2508
+ id_priv -> id .ps , id_priv -> id .qp_type , id_priv );
2509
+ if (IS_ERR (dev_id_priv ))
2481
2510
return ;
2482
2511
2483
- dev_id_priv = container_of (id , struct rdma_id_private , id );
2484
-
2485
2512
dev_id_priv -> state = RDMA_CM_ADDR_BOUND ;
2486
2513
memcpy (cma_src_addr (dev_id_priv ), cma_src_addr (id_priv ),
2487
2514
rdma_addr_size (cma_src_addr (id_priv )));
@@ -2494,7 +2521,7 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
2494
2521
dev_id_priv -> tos_set = id_priv -> tos_set ;
2495
2522
dev_id_priv -> tos = id_priv -> tos ;
2496
2523
2497
- ret = rdma_listen (id , id_priv -> backlog );
2524
+ ret = rdma_listen (& dev_id_priv -> id , id_priv -> backlog );
2498
2525
if (ret )
2499
2526
dev_warn (& cma_dev -> device -> dev ,
2500
2527
"RDMA CMA: cma_listen_on_dev, error %d\n" , ret );
@@ -4149,17 +4176,32 @@ static int cma_send_sidr_rep(struct rdma_id_private *id_priv,
4149
4176
return ib_send_cm_sidr_rep (id_priv -> cm_id .ib , & rep );
4150
4177
}
4151
4178
4152
- int __rdma_accept (struct rdma_cm_id * id , struct rdma_conn_param * conn_param ,
4153
- const char * caller )
4179
+ /**
4180
+ * rdma_accept - Called to accept a connection request or response.
4181
+ * @id: Connection identifier associated with the request.
4182
+ * @conn_param: Information needed to establish the connection. This must be
4183
+ * provided if accepting a connection request. If accepting a connection
4184
+ * response, this parameter must be NULL.
4185
+ *
4186
+ * Typically, this routine is only called by the listener to accept a connection
4187
+ * request. It must also be called on the active side of a connection if the
4188
+ * user is performing their own QP transitions.
4189
+ *
4190
+ * In the case of error, a reject message is sent to the remote side and the
4191
+ * state of the qp associated with the id is modified to error, such that any
4192
+ * previously posted receive buffers would be flushed.
4193
+ *
4194
+ * This function is for use by kernel ULPs and must be called from under the
4195
+ * handler callback.
4196
+ */
4197
+ int rdma_accept (struct rdma_cm_id * id , struct rdma_conn_param * conn_param )
4154
4198
{
4155
4199
struct rdma_id_private * id_priv =
4156
4200
container_of (id , struct rdma_id_private , id );
4157
4201
int ret ;
4158
4202
4159
4203
lockdep_assert_held (& id_priv -> handler_mutex );
4160
4204
4161
- rdma_restrack_set_task (& id_priv -> res , caller );
4162
-
4163
4205
if (READ_ONCE (id_priv -> state ) != RDMA_CM_CONNECT )
4164
4206
return - EINVAL ;
4165
4207
@@ -4198,20 +4240,20 @@ int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
4198
4240
rdma_reject (id , NULL , 0 , IB_CM_REJ_CONSUMER_DEFINED );
4199
4241
return ret ;
4200
4242
}
4201
- EXPORT_SYMBOL (__rdma_accept );
4243
+ EXPORT_SYMBOL (rdma_accept );
4202
4244
4203
- int __rdma_accept_ece (struct rdma_cm_id * id , struct rdma_conn_param * conn_param ,
4204
- const char * caller , struct rdma_ucm_ece * ece )
4245
+ int rdma_accept_ece (struct rdma_cm_id * id , struct rdma_conn_param * conn_param ,
4246
+ struct rdma_ucm_ece * ece )
4205
4247
{
4206
4248
struct rdma_id_private * id_priv =
4207
4249
container_of (id , struct rdma_id_private , id );
4208
4250
4209
4251
id_priv -> ece .vendor_id = ece -> vendor_id ;
4210
4252
id_priv -> ece .attr_mod = ece -> attr_mod ;
4211
4253
4212
- return __rdma_accept (id , conn_param , caller );
4254
+ return rdma_accept (id , conn_param );
4213
4255
}
4214
- EXPORT_SYMBOL (__rdma_accept_ece );
4256
+ EXPORT_SYMBOL (rdma_accept_ece );
4215
4257
4216
4258
void rdma_lock_handler (struct rdma_cm_id * id )
4217
4259
{
0 commit comments