Lines Matching +full:i +full:- +full:leak +full:- +full:current

1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
3 * Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved.
18 * rdma_restrack_init() - initialize and allocate resource tracking
26 int i; in rdma_restrack_init() local
28 dev->res = kcalloc(RDMA_RESTRACK_MAX, sizeof(*rt), GFP_KERNEL); in rdma_restrack_init()
29 if (!dev->res) in rdma_restrack_init()
30 return -ENOMEM; in rdma_restrack_init()
32 rt = dev->res; in rdma_restrack_init()
34 for (i = 0; i < RDMA_RESTRACK_MAX; i++) in rdma_restrack_init()
35 xa_init_flags(&rt[i].xa, XA_FLAGS_ALLOC); in rdma_restrack_init()
57 * rdma_restrack_clean() - clean resource tracking
62 struct rdma_restrack_root *rt = dev->res; in rdma_restrack_clean()
67 int i; in rdma_restrack_clean() local
69 for (i = 0 ; i < RDMA_RESTRACK_MAX; i++) { in rdma_restrack_clean()
70 struct xarray *xa = &dev->res[i].xa; in rdma_restrack_clean()
77 dev_err(&dev->dev, "BUG: RESTRACK detected leak of resources\n"); in rdma_restrack_clean()
81 owner = e->kern_name; in rdma_restrack_clean()
88 get_task_comm(buf, e->task); in rdma_restrack_clean()
95 type2str(e->type), owner); in rdma_restrack_clean()
108 * rdma_restrack_count() - the current usage of specific object
114 struct rdma_restrack_root *rt = &dev->res[type]; in rdma_restrack_count()
116 XA_STATE(xas, &rt->xa, 0); in rdma_restrack_count()
119 xa_lock(&rt->xa); in rdma_restrack_count()
122 xa_unlock(&rt->xa); in rdma_restrack_count()
129 switch (res->type) { in res_to_dev()
131 return container_of(res, struct ib_pd, res)->device; in res_to_dev()
133 return container_of(res, struct ib_cq, res)->device; in res_to_dev()
135 return container_of(res, struct ib_qp, res)->device; in res_to_dev()
138 res)->id.device; in res_to_dev()
140 return container_of(res, struct ib_mr, res)->device; in res_to_dev()
142 return container_of(res, struct ib_ucontext, res)->device; in res_to_dev()
144 return container_of(res, struct rdma_counter, res)->device; in res_to_dev()
146 return container_of(res, struct ib_srq, res)->device; in res_to_dev()
148 WARN_ONCE(true, "Wrong resource tracking type %u\n", res->type); in res_to_dev()
154 * rdma_restrack_attach_task() - attach the task onto this resource,
165 if (res->task) in rdma_restrack_attach_task()
166 put_task_struct(res->task); in rdma_restrack_attach_task()
168 res->task = task; in rdma_restrack_attach_task()
169 res->user = true; in rdma_restrack_attach_task()
173 * rdma_restrack_set_name() - set the task for this resource
175 * @caller: kernel name, the current task will be used if the caller is NULL.
180 res->kern_name = caller; in rdma_restrack_set_name()
184 rdma_restrack_attach_task(res, current); in rdma_restrack_set_name()
189 * rdma_restrack_parent_name() - set the restrack name properties based
198 dst->kern_name = parent->kern_name; in rdma_restrack_parent_name()
200 rdma_restrack_attach_task(dst, parent->task); in rdma_restrack_parent_name()
205 * rdma_restrack_new() - Initializes new restrack entry to allow _put() interface
213 kref_init(&res->kref); in rdma_restrack_new()
214 init_completion(&res->comp); in rdma_restrack_new()
215 res->type = type; in rdma_restrack_new()
220 * rdma_restrack_add() - add object to the reource tracking database
232 if (res->no_track) in rdma_restrack_add()
235 rt = &dev->res[res->type]; in rdma_restrack_add()
237 if (res->type == RDMA_RESTRACK_QP) { in rdma_restrack_add()
241 WARN_ONCE(qp->qp_num >> 24 || qp->port >> 8, in rdma_restrack_add()
242 "QP number 0x%0X and port 0x%0X", qp->qp_num, in rdma_restrack_add()
243 qp->port); in rdma_restrack_add()
244 res->id = qp->qp_num; in rdma_restrack_add()
245 if (qp->qp_type == IB_QPT_SMI || qp->qp_type == IB_QPT_GSI) in rdma_restrack_add()
246 res->id |= qp->port << 24; in rdma_restrack_add()
247 ret = xa_insert(&rt->xa, res->id, res, GFP_KERNEL); in rdma_restrack_add()
249 res->id = 0; in rdma_restrack_add()
250 } else if (res->type == RDMA_RESTRACK_COUNTER) { in rdma_restrack_add()
255 ret = xa_insert(&rt->xa, counter->id, res, GFP_KERNEL); in rdma_restrack_add()
256 res->id = ret ? 0 : counter->id; in rdma_restrack_add()
258 ret = xa_alloc_cyclic(&rt->xa, &res->id, res, xa_limit_32b, in rdma_restrack_add()
259 &rt->next_id, GFP_KERNEL); in rdma_restrack_add()
265 res->valid = true; in rdma_restrack_add()
271 return kref_get_unless_zero(&res->kref); in rdma_restrack_get()
276 * rdma_restrack_get_byid() - translate from ID to restrack object
281 * Return: Pointer to restrack entry or -ENOENT in case of error.
287 struct rdma_restrack_root *rt = &dev->res[type]; in rdma_restrack_get_byid()
290 xa_lock(&rt->xa); in rdma_restrack_get_byid()
291 res = xa_load(&rt->xa, id); in rdma_restrack_get_byid()
293 res = ERR_PTR(-ENOENT); in rdma_restrack_get_byid()
294 xa_unlock(&rt->xa); in rdma_restrack_get_byid()
305 if (res->task) { in restrack_release()
306 put_task_struct(res->task); in restrack_release()
307 res->task = NULL; in restrack_release()
309 complete(&res->comp); in restrack_release()
314 return kref_put(&res->kref, restrack_release); in rdma_restrack_put()
319 * rdma_restrack_del() - delete object from the reource tracking database
328 if (!res->valid) { in rdma_restrack_del()
329 if (res->task) { in rdma_restrack_del()
330 put_task_struct(res->task); in rdma_restrack_del()
331 res->task = NULL; in rdma_restrack_del()
336 if (res->no_track) in rdma_restrack_del()
343 rt = &dev->res[res->type]; in rdma_restrack_del()
345 old = xa_erase(&rt->xa, res->id); in rdma_restrack_del()
349 res->valid = false; in rdma_restrack_del()
351 wait_for_completion(&res->comp); in rdma_restrack_del()