Skip to content

Commit b09c4d7

Browse files
Leon Romanovskyjgunthorpe
authored andcommitted
RDMA/restrack: Improve readability in task name management
Use rdma_restrack_set_name() and rdma_restrack_parent_name() instead of tricky uses of rdma_restrack_attach_task()/rdma_restrack_uadd(). This uniformly makes all restracks add'd using rdma_restrack_add(). Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent c34a23c commit b09c4d7

File tree

12 files changed

+172
-159
lines changed

12 files changed

+172
-159
lines changed

drivers/infiniband/core/cma.c

Lines changed: 88 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,8 @@ static void _cma_attach_to_dev(struct rdma_id_private *id_priv,
453453
id_priv->id.route.addr.dev_addr.transport =
454454
rdma_node_get_transport(cma_dev->device->node_type);
455455
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+
460458
trace_cm_id_attach(id_priv, cma_dev->device);
461459
}
462460

@@ -822,10 +820,10 @@ static void cma_id_put(struct rdma_id_private *id_priv)
822820
complete(&id_priv->comp);
823821
}
824822

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)
829827
{
830828
struct rdma_id_private *id_priv;
831829

@@ -853,11 +851,44 @@ struct rdma_cm_id *__rdma_create_id(struct net *net,
853851
id_priv->seq_num &= 0x00ffffff;
854852

855853
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);
857856

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;
859890
}
860-
EXPORT_SYMBOL(__rdma_create_id);
891+
EXPORT_SYMBOL(rdma_create_user_id);
861892

862893
static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
863894
{
@@ -2029,14 +2060,15 @@ cma_ib_new_conn_id(const struct rdma_cm_id *listen_id,
20292060
int ret;
20302061

20312062
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))
20372069
return NULL;
20382070

2039-
id_priv = container_of(id, struct rdma_id_private, id);
2071+
id = &id_priv->id;
20402072
if (cma_save_net_info((struct sockaddr *)&id->route.addr.src_addr,
20412073
(struct sockaddr *)&id->route.addr.dst_addr,
20422074
listen_id, ib_event, ss_family, service_id))
@@ -2090,13 +2122,13 @@ cma_ib_new_udp_id(const struct rdma_cm_id *listen_id,
20902122
int ret;
20912123

20922124
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))
20972129
return NULL;
20982130

2099-
id_priv = container_of(id, struct rdma_id_private, id);
2131+
id = &id_priv->id;
21002132
if (cma_save_net_info((struct sockaddr *)&id->route.addr.src_addr,
21012133
(struct sockaddr *)&id->route.addr.dst_addr,
21022134
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)
23322364
static int iw_conn_req_handler(struct iw_cm_id *cm_id,
23332365
struct iw_cm_event *iw_event)
23342366
{
2335-
struct rdma_cm_id *new_cm_id;
23362367
struct rdma_id_private *listen_id, *conn_id;
23372368
struct rdma_cm_event event = {};
23382369
int ret = -ECONNABORTED;
@@ -2352,16 +2383,14 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
23522383
goto out;
23532384

23542385
/* 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)) {
23612391
ret = -ENOMEM;
23622392
goto out;
23632393
}
2364-
conn_id = container_of(new_cm_id, struct rdma_id_private, id);
23652394
mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
23662395
conn_id->state = RDMA_CM_CONNECT;
23672396

@@ -2466,7 +2495,6 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
24662495
struct cma_device *cma_dev)
24672496
{
24682497
struct rdma_id_private *dev_id_priv;
2469-
struct rdma_cm_id *id;
24702498
struct net *net = id_priv->id.route.addr.dev_addr.net;
24712499
int ret;
24722500

@@ -2475,13 +2503,12 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
24752503
if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1))
24762504
return;
24772505

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))
24812510
return;
24822511

2483-
dev_id_priv = container_of(id, struct rdma_id_private, id);
2484-
24852512
dev_id_priv->state = RDMA_CM_ADDR_BOUND;
24862513
memcpy(cma_src_addr(dev_id_priv), cma_src_addr(id_priv),
24872514
rdma_addr_size(cma_src_addr(id_priv)));
@@ -2494,7 +2521,7 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv,
24942521
dev_id_priv->tos_set = id_priv->tos_set;
24952522
dev_id_priv->tos = id_priv->tos;
24962523

2497-
ret = rdma_listen(id, id_priv->backlog);
2524+
ret = rdma_listen(&dev_id_priv->id, id_priv->backlog);
24982525
if (ret)
24992526
dev_warn(&cma_dev->device->dev,
25002527
"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,
41494176
return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep);
41504177
}
41514178

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)
41544198
{
41554199
struct rdma_id_private *id_priv =
41564200
container_of(id, struct rdma_id_private, id);
41574201
int ret;
41584202

41594203
lockdep_assert_held(&id_priv->handler_mutex);
41604204

4161-
rdma_restrack_set_task(&id_priv->res, caller);
4162-
41634205
if (READ_ONCE(id_priv->state) != RDMA_CM_CONNECT)
41644206
return -EINVAL;
41654207

@@ -4198,20 +4240,20 @@ int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
41984240
rdma_reject(id, NULL, 0, IB_CM_REJ_CONSUMER_DEFINED);
41994241
return ret;
42004242
}
4201-
EXPORT_SYMBOL(__rdma_accept);
4243+
EXPORT_SYMBOL(rdma_accept);
42024244

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)
42054247
{
42064248
struct rdma_id_private *id_priv =
42074249
container_of(id, struct rdma_id_private, id);
42084250

42094251
id_priv->ece.vendor_id = ece->vendor_id;
42104252
id_priv->ece.attr_mod = ece->attr_mod;
42114253

4212-
return __rdma_accept(id, conn_param, caller);
4254+
return rdma_accept(id, conn_param);
42134255
}
4214-
EXPORT_SYMBOL(__rdma_accept_ece);
4256+
EXPORT_SYMBOL(rdma_accept_ece);
42154257

42164258
void rdma_lock_handler(struct rdma_cm_id *id)
42174259
{

drivers/infiniband/core/core_priv.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,9 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
361361
*/
362362
is_xrc = qp_type == IB_QPT_XRC_INI || qp_type == IB_QPT_XRC_TGT;
363363
if ((qp_type < IB_QPT_MAX && !is_xrc) || qp_type == IB_QPT_DRIVER) {
364-
if (uobj)
365-
rdma_restrack_uadd(&qp->res);
366-
else {
367-
rdma_restrack_set_task(&qp->res, pd->res.kern_name);
368-
rdma_restrack_add(&qp->res);
369-
}
370-
} else
371-
qp->res.valid = false;
372-
364+
rdma_restrack_parent_name(&qp->res, &pd->res);
365+
rdma_restrack_add(&qp->res);
366+
}
373367
return qp;
374368
}
375369

drivers/infiniband/core/counters.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,8 @@ static struct rdma_counter *rdma_get_counter_auto_mode(struct ib_qp *qp,
250250
static void rdma_counter_res_add(struct rdma_counter *counter,
251251
struct ib_qp *qp)
252252
{
253-
if (rdma_is_kernel_res(&qp->res)) {
254-
rdma_restrack_set_task(&counter->res, qp->res.kern_name);
255-
rdma_restrack_add(&counter->res);
256-
} else {
257-
rdma_restrack_attach_task(&counter->res, qp->res.task);
258-
rdma_restrack_uadd(&counter->res);
259-
}
253+
rdma_restrack_parent_name(&counter->res, &qp->res);
254+
rdma_restrack_add(&counter->res);
260255
}
261256

262257
static void counter_release(struct kref *kref)

drivers/infiniband/core/cq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private, int nr_cqe,
236236
goto out_free_cq;
237237

238238
rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
239-
rdma_restrack_set_task(&cq->res, caller);
239+
rdma_restrack_set_name(&cq->res, caller);
240240

241241
ret = dev->ops.create_cq(cq, &cq_attr, NULL);
242242
if (ret)

drivers/infiniband/core/restrack.c

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -147,34 +147,56 @@ static struct ib_device *res_to_dev(struct rdma_restrack_entry *res)
147147
}
148148
}
149149

150-
void rdma_restrack_set_task(struct rdma_restrack_entry *res,
151-
const char *caller)
150+
/**
151+
* rdma_restrack_attach_task() - attach the task onto this resource,
152+
* valid for user space restrack entries.
153+
* @res: resource entry
154+
* @task: the task to attach
155+
*/
156+
static void rdma_restrack_attach_task(struct rdma_restrack_entry *res,
157+
struct task_struct *task)
152158
{
153-
if (caller) {
154-
res->kern_name = caller;
159+
if (WARN_ON_ONCE(!task))
155160
return;
156-
}
157161

158162
if (res->task)
159163
put_task_struct(res->task);
160-
get_task_struct(current);
161-
res->task = current;
164+
get_task_struct(task);
165+
res->task = task;
166+
res->user = true;
162167
}
163-
EXPORT_SYMBOL(rdma_restrack_set_task);
164168

165169
/**
166-
* rdma_restrack_attach_task() - attach the task onto this resource
170+
* rdma_restrack_set_name() - set the task for this resource
167171
* @res: resource entry
168-
* @task: the task to attach, the current task will be used if it is NULL.
172+
* @caller: kernel name, the current task will be used if the caller is NULL.
169173
*/
170-
void rdma_restrack_attach_task(struct rdma_restrack_entry *res,
171-
struct task_struct *task)
174+
void rdma_restrack_set_name(struct rdma_restrack_entry *res, const char *caller)
172175
{
173-
if (res->task)
174-
put_task_struct(res->task);
175-
get_task_struct(task);
176-
res->task = task;
176+
if (caller) {
177+
res->kern_name = caller;
178+
return;
179+
}
180+
181+
rdma_restrack_attach_task(res, current);
182+
}
183+
EXPORT_SYMBOL(rdma_restrack_set_name);
184+
185+
/**
186+
* rdma_restrack_parent_name() - set the restrack name properties based
187+
* on parent restrack
188+
* @dst: destination resource entry
189+
* @parent: parent resource entry
190+
*/
191+
void rdma_restrack_parent_name(struct rdma_restrack_entry *dst,
192+
const struct rdma_restrack_entry *parent)
193+
{
194+
if (rdma_is_kernel_res(parent))
195+
dst->kern_name = parent->kern_name;
196+
else
197+
rdma_restrack_attach_task(dst, parent->task);
177198
}
199+
EXPORT_SYMBOL(rdma_restrack_parent_name);
178200

179201
/**
180202
* rdma_restrack_new() - Initializes new restrack entry to allow _put() interface
@@ -229,25 +251,6 @@ void rdma_restrack_add(struct rdma_restrack_entry *res)
229251
}
230252
EXPORT_SYMBOL(rdma_restrack_add);
231253

232-
/**
233-
* rdma_restrack_uadd() - add user object to the reource tracking database
234-
* @res: resource entry
235-
*/
236-
void rdma_restrack_uadd(struct rdma_restrack_entry *res)
237-
{
238-
if ((res->type != RDMA_RESTRACK_CM_ID) &&
239-
(res->type != RDMA_RESTRACK_COUNTER))
240-
res->task = NULL;
241-
242-
if (!res->task)
243-
rdma_restrack_set_task(res, NULL);
244-
res->kern_name = NULL;
245-
246-
res->user = true;
247-
rdma_restrack_add(res);
248-
}
249-
EXPORT_SYMBOL(rdma_restrack_uadd);
250-
251254
int __must_check rdma_restrack_get(struct rdma_restrack_entry *res)
252255
{
253256
return kref_get_unless_zero(&res->kref);

drivers/infiniband/core/restrack.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ void rdma_restrack_add(struct rdma_restrack_entry *res);
2929
void rdma_restrack_del(struct rdma_restrack_entry *res);
3030
void rdma_restrack_new(struct rdma_restrack_entry *res,
3131
enum rdma_restrack_type type);
32-
void rdma_restrack_attach_task(struct rdma_restrack_entry *res,
33-
struct task_struct *task);
32+
void rdma_restrack_set_name(struct rdma_restrack_entry *res,
33+
const char *caller);
34+
void rdma_restrack_parent_name(struct rdma_restrack_entry *dst,
35+
const struct rdma_restrack_entry *parent);
3436
#endif /* _RDMA_CORE_RESTRACK_H_ */

0 commit comments

Comments
 (0)