|
@@ -466,6 +466,8 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
|
|
|
id_priv->id.route.addr.dev_addr.transport =
|
|
|
rdma_node_get_transport(cma_dev->device->node_type);
|
|
|
list_add_tail(&id_priv->list, &cma_dev->id_list);
|
|
|
+ id_priv->res.type = RDMA_RESTRACK_CM_ID;
|
|
|
+ rdma_restrack_add(&id_priv->res);
|
|
|
}
|
|
|
|
|
|
static void cma_attach_to_dev(struct rdma_id_private *id_priv,
|
|
@@ -738,10 +740,10 @@ static void cma_deref_id(struct rdma_id_private *id_priv)
|
|
|
complete(&id_priv->comp);
|
|
|
}
|
|
|
|
|
|
-struct rdma_cm_id *rdma_create_id(struct net *net,
|
|
|
- rdma_cm_event_handler event_handler,
|
|
|
- void *context, enum rdma_port_space ps,
|
|
|
- enum ib_qp_type qp_type)
|
|
|
+struct rdma_cm_id *__rdma_create_id(struct net *net,
|
|
|
+ rdma_cm_event_handler event_handler,
|
|
|
+ void *context, enum rdma_port_space ps,
|
|
|
+ enum ib_qp_type qp_type, const char *caller)
|
|
|
{
|
|
|
struct rdma_id_private *id_priv;
|
|
|
|
|
@@ -749,7 +751,10 @@ struct rdma_cm_id *rdma_create_id(struct net *net,
|
|
|
if (!id_priv)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- id_priv->owner = task_pid_nr(current);
|
|
|
+ if (caller)
|
|
|
+ id_priv->res.kern_name = caller;
|
|
|
+ else
|
|
|
+ rdma_restrack_set_task(&id_priv->res, current);
|
|
|
id_priv->state = RDMA_CM_IDLE;
|
|
|
id_priv->id.context = context;
|
|
|
id_priv->id.event_handler = event_handler;
|
|
@@ -769,7 +774,7 @@ struct rdma_cm_id *rdma_create_id(struct net *net,
|
|
|
|
|
|
return &id_priv->id;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(rdma_create_id);
|
|
|
+EXPORT_SYMBOL(__rdma_create_id);
|
|
|
|
|
|
static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
|
|
|
{
|
|
@@ -1629,6 +1634,7 @@ void rdma_destroy_id(struct rdma_cm_id *id)
|
|
|
mutex_unlock(&id_priv->handler_mutex);
|
|
|
|
|
|
if (id_priv->cma_dev) {
|
|
|
+ rdma_restrack_del(&id_priv->res);
|
|
|
if (rdma_cap_ib_cm(id_priv->id.device, 1)) {
|
|
|
if (id_priv->cm_id.ib)
|
|
|
ib_destroy_cm_id(id_priv->cm_id.ib);
|
|
@@ -1778,6 +1784,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
struct ib_cm_event *ib_event,
|
|
|
struct net_device *net_dev)
|
|
|
{
|
|
|
+ struct rdma_id_private *listen_id_priv;
|
|
|
struct rdma_id_private *id_priv;
|
|
|
struct rdma_cm_id *id;
|
|
|
struct rdma_route *rt;
|
|
@@ -1787,9 +1794,11 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
|
|
ib_event->param.req_rcvd.primary_path->service_id;
|
|
|
int ret;
|
|
|
|
|
|
- id = rdma_create_id(listen_id->route.addr.dev_addr.net,
|
|
|
+ listen_id_priv = container_of(listen_id, struct rdma_id_private, id);
|
|
|
+ id = __rdma_create_id(listen_id->route.addr.dev_addr.net,
|
|
|
listen_id->event_handler, listen_id->context,
|
|
|
- listen_id->ps, ib_event->param.req_rcvd.qp_type);
|
|
|
+ listen_id->ps, ib_event->param.req_rcvd.qp_type,
|
|
|
+ listen_id_priv->res.kern_name);
|
|
|
if (IS_ERR(id))
|
|
|
return NULL;
|
|
|
|
|
@@ -1838,14 +1847,17 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
|
|
|
struct ib_cm_event *ib_event,
|
|
|
struct net_device *net_dev)
|
|
|
{
|
|
|
+ struct rdma_id_private *listen_id_priv;
|
|
|
struct rdma_id_private *id_priv;
|
|
|
struct rdma_cm_id *id;
|
|
|
const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
|
|
|
struct net *net = listen_id->route.addr.dev_addr.net;
|
|
|
int ret;
|
|
|
|
|
|
- id = rdma_create_id(net, listen_id->event_handler, listen_id->context,
|
|
|
- listen_id->ps, IB_QPT_UD);
|
|
|
+ listen_id_priv = container_of(listen_id, struct rdma_id_private, id);
|
|
|
+ id = __rdma_create_id(net, listen_id->event_handler, listen_id->context,
|
|
|
+ listen_id->ps, IB_QPT_UD,
|
|
|
+ listen_id_priv->res.kern_name);
|
|
|
if (IS_ERR(id))
|
|
|
return NULL;
|
|
|
|
|
@@ -2111,10 +2123,11 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
|
|
|
goto out;
|
|
|
|
|
|
/* Create a new RDMA id for the new IW CM ID */
|
|
|
- new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net,
|
|
|
- listen_id->id.event_handler,
|
|
|
- listen_id->id.context,
|
|
|
- RDMA_PS_TCP, IB_QPT_RC);
|
|
|
+ new_cm_id = __rdma_create_id(listen_id->id.route.addr.dev_addr.net,
|
|
|
+ listen_id->id.event_handler,
|
|
|
+ listen_id->id.context,
|
|
|
+ RDMA_PS_TCP, IB_QPT_RC,
|
|
|
+ listen_id->res.kern_name);
|
|
|
if (IS_ERR(new_cm_id)) {
|
|
|
ret = -ENOMEM;
|
|
|
goto out;
|
|
@@ -2239,8 +2252,8 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
|
|
|
if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1))
|
|
|
return;
|
|
|
|
|
|
- id = rdma_create_id(net, cma_listen_handler, id_priv, id_priv->id.ps,
|
|
|
- id_priv->id.qp_type);
|
|
|
+ id = __rdma_create_id(net, cma_listen_handler, id_priv, id_priv->id.ps,
|
|
|
+ id_priv->id.qp_type, id_priv->res.kern_name);
|
|
|
if (IS_ERR(id))
|
|
|
return;
|
|
|
|
|
@@ -3348,8 +3361,10 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
|
|
|
|
|
|
return 0;
|
|
|
err2:
|
|
|
- if (id_priv->cma_dev)
|
|
|
+ if (id_priv->cma_dev) {
|
|
|
+ rdma_restrack_del(&id_priv->res);
|
|
|
cma_release_dev(id_priv);
|
|
|
+ }
|
|
|
err1:
|
|
|
cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE);
|
|
|
return ret;
|
|
@@ -3732,14 +3747,18 @@ static int cma_send_sidr_rep(struct rdma_id_private *id_priv,
|
|
|
return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep);
|
|
|
}
|
|
|
|
|
|
-int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
|
|
|
+int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
|
|
|
+ const char *caller)
|
|
|
{
|
|
|
struct rdma_id_private *id_priv;
|
|
|
int ret;
|
|
|
|
|
|
id_priv = container_of(id, struct rdma_id_private, id);
|
|
|
|
|
|
- id_priv->owner = task_pid_nr(current);
|
|
|
+ if (caller)
|
|
|
+ id_priv->res.kern_name = caller;
|
|
|
+ else
|
|
|
+ rdma_restrack_set_task(&id_priv->res, current);
|
|
|
|
|
|
if (!cma_comp(id_priv, RDMA_CM_CONNECT))
|
|
|
return -EINVAL;
|
|
@@ -3779,7 +3798,7 @@ reject:
|
|
|
rdma_reject(id, NULL, 0);
|
|
|
return ret;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(rdma_accept);
|
|
|
+EXPORT_SYMBOL(__rdma_accept);
|
|
|
|
|
|
int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
|
|
|
{
|
|
@@ -4457,7 +4476,7 @@ static int cma_get_id_stats(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
RDMA_NL_RDMA_CM_ATTR_DST_ADDR))
|
|
|
goto out;
|
|
|
|
|
|
- id_stats->pid = id_priv->owner;
|
|
|
+ id_stats->pid = task_pid_vnr(id_priv->res.task);
|
|
|
id_stats->port_space = id->ps;
|
|
|
id_stats->cm_state = id_priv->state;
|
|
|
id_stats->qp_num = id_priv->qp_num;
|