|
@@ -406,11 +406,6 @@ static int cma_disable_callback(struct rdma_id_private *id_priv,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int cma_has_cm_dev(struct rdma_id_private *id_priv)
|
|
|
-{
|
|
|
- return (id_priv->id.device && id_priv->cm_id.ib);
|
|
|
-}
|
|
|
-
|
|
|
struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
|
|
|
void *context, enum rdma_port_space ps,
|
|
|
enum ib_qp_type qp_type)
|
|
@@ -920,11 +915,11 @@ void rdma_destroy_id(struct rdma_cm_id *id)
|
|
|
if (id_priv->cma_dev) {
|
|
|
switch (rdma_node_get_transport(id_priv->id.device->node_type)) {
|
|
|
case RDMA_TRANSPORT_IB:
|
|
|
- if (id_priv->cm_id.ib && !IS_ERR(id_priv->cm_id.ib))
|
|
|
+ if (id_priv->cm_id.ib)
|
|
|
ib_destroy_cm_id(id_priv->cm_id.ib);
|
|
|
break;
|
|
|
case RDMA_TRANSPORT_IWARP:
|
|
|
- if (id_priv->cm_id.iw && !IS_ERR(id_priv->cm_id.iw))
|
|
|
+ if (id_priv->cm_id.iw)
|
|
|
iw_destroy_cm_id(id_priv->cm_id.iw);
|
|
|
break;
|
|
|
default:
|
|
@@ -1085,12 +1080,12 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
|
|
|
if (cma_get_net_info(ib_event->private_data, listen_id->ps,
|
|
|
&ip_ver, &port, &src, &dst))
|
|
|
- goto err;
|
|
|
+ return NULL;
|
|
|
|
|
|
id = rdma_create_id(listen_id->event_handler, listen_id->context,
|
|
|
listen_id->ps, ib_event->param.req_rcvd.qp_type);
|
|
|
if (IS_ERR(id))
|
|
|
- goto err;
|
|
|
+ return NULL;
|
|
|
|
|
|
cma_save_net_info(&id->route.addr, &listen_id->route.addr,
|
|
|
ip_ver, port, src, dst);
|
|
@@ -1100,7 +1095,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths,
|
|
|
GFP_KERNEL);
|
|
|
if (!rt->path_rec)
|
|
|
- goto destroy_id;
|
|
|
+ goto err;
|
|
|
|
|
|
rt->path_rec[0] = *ib_event->param.req_rcvd.primary_path;
|
|
|
if (rt->num_paths == 2)
|
|
@@ -1114,7 +1109,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
ret = rdma_translate_ip((struct sockaddr *) &rt->addr.src_addr,
|
|
|
&rt->addr.dev_addr);
|
|
|
if (ret)
|
|
|
- goto destroy_id;
|
|
|
+ goto err;
|
|
|
}
|
|
|
rdma_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
|
|
|
|
|
@@ -1122,9 +1117,8 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
id_priv->state = RDMA_CM_CONNECT;
|
|
|
return id_priv;
|
|
|
|
|
|
-destroy_id:
|
|
|
- rdma_destroy_id(id);
|
|
|
err:
|
|
|
+ rdma_destroy_id(id);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
@@ -1468,13 +1462,15 @@ static int cma_ib_listen(struct rdma_id_private *id_priv)
|
|
|
{
|
|
|
struct ib_cm_compare_data compare_data;
|
|
|
struct sockaddr *addr;
|
|
|
+ struct ib_cm_id *id;
|
|
|
__be64 svc_id;
|
|
|
int ret;
|
|
|
|
|
|
- id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_req_handler,
|
|
|
- id_priv);
|
|
|
- if (IS_ERR(id_priv->cm_id.ib))
|
|
|
- return PTR_ERR(id_priv->cm_id.ib);
|
|
|
+ id = ib_create_cm_id(id_priv->id.device, cma_req_handler, id_priv);
|
|
|
+ if (IS_ERR(id))
|
|
|
+ return PTR_ERR(id);
|
|
|
+
|
|
|
+ id_priv->cm_id.ib = id;
|
|
|
|
|
|
addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
|
|
|
svc_id = cma_get_service_id(id_priv->id.ps, addr);
|
|
@@ -1497,12 +1493,15 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
|
|
|
{
|
|
|
int ret;
|
|
|
struct sockaddr_in *sin;
|
|
|
+ struct iw_cm_id *id;
|
|
|
+
|
|
|
+ id = iw_create_cm_id(id_priv->id.device,
|
|
|
+ iw_conn_req_handler,
|
|
|
+ id_priv);
|
|
|
+ if (IS_ERR(id))
|
|
|
+ return PTR_ERR(id);
|
|
|
|
|
|
- id_priv->cm_id.iw = iw_create_cm_id(id_priv->id.device,
|
|
|
- iw_conn_req_handler,
|
|
|
- id_priv);
|
|
|
- if (IS_ERR(id_priv->cm_id.iw))
|
|
|
- return PTR_ERR(id_priv->cm_id.iw);
|
|
|
+ id_priv->cm_id.iw = id;
|
|
|
|
|
|
sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr;
|
|
|
id_priv->cm_id.iw->local_addr = *sin;
|
|
@@ -2484,6 +2483,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
|
|
|
{
|
|
|
struct ib_cm_sidr_req_param req;
|
|
|
struct rdma_route *route;
|
|
|
+ struct ib_cm_id *id;
|
|
|
int ret;
|
|
|
|
|
|
req.private_data_len = sizeof(struct cma_hdr) +
|
|
@@ -2501,12 +2501,13 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
- id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device,
|
|
|
- cma_sidr_rep_handler, id_priv);
|
|
|
- if (IS_ERR(id_priv->cm_id.ib)) {
|
|
|
- ret = PTR_ERR(id_priv->cm_id.ib);
|
|
|
+ id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler,
|
|
|
+ id_priv);
|
|
|
+ if (IS_ERR(id)) {
|
|
|
+ ret = PTR_ERR(id);
|
|
|
goto out;
|
|
|
}
|
|
|
+ id_priv->cm_id.ib = id;
|
|
|
|
|
|
req.path = route->path_rec;
|
|
|
req.service_id = cma_get_service_id(id_priv->id.ps,
|
|
@@ -2530,6 +2531,7 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
|
|
|
struct ib_cm_req_param req;
|
|
|
struct rdma_route *route;
|
|
|
void *private_data;
|
|
|
+ struct ib_cm_id *id;
|
|
|
int offset, ret;
|
|
|
|
|
|
memset(&req, 0, sizeof req);
|
|
@@ -2543,12 +2545,12 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
|
|
|
memcpy(private_data + offset, conn_param->private_data,
|
|
|
conn_param->private_data_len);
|
|
|
|
|
|
- id_priv->cm_id.ib = ib_create_cm_id(id_priv->id.device, cma_ib_handler,
|
|
|
- id_priv);
|
|
|
- if (IS_ERR(id_priv->cm_id.ib)) {
|
|
|
- ret = PTR_ERR(id_priv->cm_id.ib);
|
|
|
+ id = ib_create_cm_id(id_priv->id.device, cma_ib_handler, id_priv);
|
|
|
+ if (IS_ERR(id)) {
|
|
|
+ ret = PTR_ERR(id);
|
|
|
goto out;
|
|
|
}
|
|
|
+ id_priv->cm_id.ib = id;
|
|
|
|
|
|
route = &id_priv->id.route;
|
|
|
ret = cma_format_hdr(private_data, id_priv->id.ps, route);
|
|
@@ -2577,8 +2579,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
|
|
|
|
|
|
ret = ib_send_cm_req(id_priv->cm_id.ib, &req);
|
|
|
out:
|
|
|
- if (ret && !IS_ERR(id_priv->cm_id.ib)) {
|
|
|
- ib_destroy_cm_id(id_priv->cm_id.ib);
|
|
|
+ if (ret && !IS_ERR(id)) {
|
|
|
+ ib_destroy_cm_id(id);
|
|
|
id_priv->cm_id.ib = NULL;
|
|
|
}
|
|
|
|
|
@@ -2595,10 +2597,8 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
|
|
|
struct iw_cm_conn_param iw_param;
|
|
|
|
|
|
cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv);
|
|
|
- if (IS_ERR(cm_id)) {
|
|
|
- ret = PTR_ERR(cm_id);
|
|
|
- goto out;
|
|
|
- }
|
|
|
+ if (IS_ERR(cm_id))
|
|
|
+ return PTR_ERR(cm_id);
|
|
|
|
|
|
id_priv->cm_id.iw = cm_id;
|
|
|
|
|
@@ -2622,7 +2622,7 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
|
|
|
iw_param.qpn = conn_param->qp_num;
|
|
|
ret = iw_cm_connect(cm_id, &iw_param);
|
|
|
out:
|
|
|
- if (ret && !IS_ERR(cm_id)) {
|
|
|
+ if (ret) {
|
|
|
iw_destroy_cm_id(cm_id);
|
|
|
id_priv->cm_id.iw = NULL;
|
|
|
}
|
|
@@ -2795,7 +2795,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
|
|
|
int ret;
|
|
|
|
|
|
id_priv = container_of(id, struct rdma_id_private, id);
|
|
|
- if (!cma_has_cm_dev(id_priv))
|
|
|
+ if (!id_priv->cm_id.ib)
|
|
|
return -EINVAL;
|
|
|
|
|
|
switch (id->device->node_type) {
|
|
@@ -2817,7 +2817,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
|
|
|
int ret;
|
|
|
|
|
|
id_priv = container_of(id, struct rdma_id_private, id);
|
|
|
- if (!cma_has_cm_dev(id_priv))
|
|
|
+ if (!id_priv->cm_id.ib)
|
|
|
return -EINVAL;
|
|
|
|
|
|
switch (rdma_node_get_transport(id->device->node_type)) {
|
|
@@ -2848,7 +2848,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
|
|
|
int ret;
|
|
|
|
|
|
id_priv = container_of(id, struct rdma_id_private, id);
|
|
|
- if (!cma_has_cm_dev(id_priv))
|
|
|
+ if (!id_priv->cm_id.ib)
|
|
|
return -EINVAL;
|
|
|
|
|
|
switch (rdma_node_get_transport(id->device->node_type)) {
|