From patchwork Sun Jan 20 13:05:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772387 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B8C36746 for ; Sun, 20 Jan 2019 13:06:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A87F82AA7A for ; Sun, 20 Jan 2019 13:06:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9C8EE2AA81; Sun, 20 Jan 2019 13:06:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2B4D92AA7A for ; Sun, 20 Jan 2019 13:06:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730583AbfATNGK (ORCPT ); Sun, 20 Jan 2019 08:06:10 -0500 Received: from mail.kernel.org ([198.145.29.99]:36316 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNGJ (ORCPT ); Sun, 20 Jan 2019 08:06:09 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0E35B2087B; Sun, 20 Jan 2019 13:06:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989568; bh=wTdzNZFcx9TSdscTK95yI5o/iqN8curPJcP4DXt6g9Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lLjDQ/fD9HyjrKTe1Zgh/ZFFQ0yMwfBk4XIujvkuxkfQchL7t+NN8OrN01C/M/WJK OGXLPgKyY0sJVkqns0B3+f3u5ejnDTa3MWXzK8lUWl1bUZHdIprZOOA2Y06MWS4szb INgG53eIs2tIyn2MhhKgEsG9TxpzPZ8VBoDm10T0= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 1/6] RDMA/restrack: Fortify source by ensuring that restrack type is set Date: Sun, 20 Jan 2019 15:05:55 +0200 Message-Id: <20190120130600.8788-2-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Allowance to use rdma_restrack_add() by the drivers can potentially create situations where restrack entry is used without type initialized before. This patch adds various checks and warnings to survive such situation, which are not supposed to be if driver authors don't do mistake. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/nldev.c | 2 +- drivers/infiniband/core/restrack.c | 32 ++++++++++++++++++++++++------ include/rdma/restrack.h | 20 +++++++++++++++++-- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c index de3e90d6fb5a..69b04fbb6e8e 100644 --- a/drivers/infiniband/core/nldev.c +++ b/drivers/infiniband/core/nldev.c @@ -324,7 +324,7 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device) if (!table_attr) return -EMSGSIZE; - for (i = 0; i < RDMA_RESTRACK_MAX; i++) { + for (i = RDMA_RESTRACK_START; i < RDMA_RESTRACK_MAX; i++) { if (!names[i]) continue; curr = rdma_restrack_count(device, i, diff --git a/drivers/infiniband/core/restrack.c b/drivers/infiniband/core/restrack.c index 415a534873fe..78f9df74396f 100644 --- a/drivers/infiniband/core/restrack.c +++ b/drivers/infiniband/core/restrack.c @@ -87,7 +87,7 @@ int rdma_restrack_init(struct ib_device *dev) rt = dev->res; - for (i = 0 ; i < RDMA_RESTRACK_MAX; i++) { + for (i = RDMA_RESTRACK_START; i < RDMA_RESTRACK_MAX; i++) { init_rwsem(&rt[i].rwsem); xa_init_flags(&rt[i].xa, XA_FLAGS_ALLOC); rt[i].range.max = U32_MAX; @@ -171,7 +171,7 @@ void rdma_restrack_clean(struct ib_device *dev) const char *owner; int i; - for (i = 0 ; i < RDMA_RESTRACK_MAX; i++) { + for (i = RDMA_RESTRACK_START; i < RDMA_RESTRACK_MAX; i++) { struct xarray *xa = rdma_dev_to_xa(dev, i); if (!xa_empty(xa)) { @@ -307,10 +307,20 @@ EXPORT_SYMBOL(rdma_restrack_set_task); int rdma_restrack_add(struct rdma_restrack_entry *res) { struct ib_device *dev = res_to_dev(res); - struct xarray *xa = rdma_dev_to_xa(dev, res->type); - struct rdma_restrack_root *rt = dev->res; + struct rdma_restrack_root *rt; + struct xarray *xa; int ret; + if (!dev) + /* + * Someone forgot to set resource type, + * never should occur in real life + */ + return -EINVAL; + + xa = rdma_dev_to_xa(dev, res->type); + rt = dev->res; + /* * Once all drivers are converted, we can remove this check * and remove call to rdma_restrack_add() from rdma_restrack_kadd() @@ -380,7 +390,12 @@ EXPORT_SYMBOL(rdma_restrack_kadd); void rdma_restrack_uadd(struct rdma_restrack_entry *res) { struct ib_device *dev = res_to_dev(res); - struct xarray *xa = rdma_dev_to_xa(dev, res->type); + struct xarray *xa; + + if (!dev) + return; + + xa = rdma_dev_to_xa(dev, res->type); if (res->type != RDMA_RESTRACK_CM_ID) res->task = NULL; @@ -520,7 +535,12 @@ EXPORT_SYMBOL(rdma_rt_set_id_range); int rdma_rt_set_id(struct rdma_restrack_entry *res, u32 id) { struct ib_device *dev = res_to_dev(res); - struct xarray *xa = rdma_dev_to_xa(dev, res->type); + struct xarray *xa; + + if (!dev) + return -EINVAL; + + xa = rdma_dev_to_xa(dev, res->type); if (xa_load(xa, id) == res) { WARN_ONCE(true, "Tried to add non-unique %s entry %u\n", diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h index aa741907d1f4..be1936b54f98 100644 --- a/include/rdma/restrack.h +++ b/include/rdma/restrack.h @@ -18,10 +18,23 @@ * enum rdma_restrack_type - HW objects to track */ enum rdma_restrack_type { + /** + * @RDMA_RESTRACK_NOT_VALID: Initial value + * + * We assume that all objects below were zeroed in the initialization + * phase and 0 as rdma_restrack_type will help us to catch unset type. + */ + RDMA_RESTRACK_NOT_VALID, + /** + * @RDMA_RESTRACK_START: Initial entry needed for iterators + */ + RDMA_RESTRACK_START, + + /* SUPPORTED OBJECTS */ /** * @RDMA_RESTRACK_PD: Protection domain (PD) */ - RDMA_RESTRACK_PD, + RDMA_RESTRACK_PD = RDMA_RESTRACK_START, /** * @RDMA_RESTRACK_CQ: Completion queue (CQ) */ @@ -43,7 +56,7 @@ enum rdma_restrack_type { */ RDMA_RESTRACK_CTX, /** - * @RDMA_RESTRACK_MAX: Last entry, used for array dclarations + * @RDMA_RESTRACK_MAX: Last entry, used for array declarations */ RDMA_RESTRACK_MAX }; @@ -192,6 +205,9 @@ int rdma_rt_set_id(struct rdma_restrack_entry *res, u32 id); static inline void rdma_rt_set_type(struct rdma_restrack_entry *res, enum rdma_restrack_type type) { + WARN_ONCE((type == RDMA_RESTRACK_NOT_VALID || + type == RDMA_RESTRACK_MAX), + "There is attempt to set not valid restrack type\n"); res->type = type; } #endif /* _RDMA_RESTRACK_H_ */ From patchwork Sun Jan 20 13:05:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772389 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4130B6C2 for ; Sun, 20 Jan 2019 13:06:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2FE592A6F1 for ; Sun, 20 Jan 2019 13:06:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 242512AA7A; Sun, 20 Jan 2019 13:06:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 54BBC2AA81 for ; Sun, 20 Jan 2019 13:06:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730585AbfATNGN (ORCPT ); Sun, 20 Jan 2019 08:06:13 -0500 Received: from mail.kernel.org ([198.145.29.99]:36348 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNGM (ORCPT ); Sun, 20 Jan 2019 08:06:12 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3A4AD20880; Sun, 20 Jan 2019 13:06:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989571; bh=MsXgQRrd0sRdQ2T5fx1NLniGPwd+Yiz0G8beRgCQodc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RFc1REX7FBJMeCuZWbPqXyglC/7fEuQWvKk5NKdEEG14M41ff5zgarWakgObSYtih TF7jt3GiOAo0D3V63r70b/6CoL3fmufvj6wbkrC+dvtbipl0yQ6D+ajZW++WCNBi4L onhRddrMCv2E2dGheRxpreW1QNnvkkj2+zZVtpGs= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 2/6] RDMA/mlx5: Use restrack allocation PD scheme Date: Sun, 20 Jan 2019 15:05:56 +0200 Message-Id: <20190120130600.8788-3-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Adapt mlx5 to share restrack ID instead of local variable. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/main.c | 39 +++++++++++++++++++--------- drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 - drivers/infiniband/hw/mlx5/mr.c | 16 ++++++------ drivers/infiniband/hw/mlx5/qp.c | 22 +++++++++------- drivers/infiniband/hw/mlx5/srq.c | 2 +- 5 files changed, 49 insertions(+), 31 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index b32b5c7f1cfd..1348e4e9e119 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -2262,33 +2262,46 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, u32 out[MLX5_ST_SZ_DW(alloc_pd_out)] = {}; u32 in[MLX5_ST_SZ_DW(alloc_pd_in)] = {}; u16 uid = 0; + u32 pdn; pd = kzalloc(sizeof(*pd), GFP_KERNEL); if (!pd) return ERR_PTR(-ENOMEM); + pd->ibpd.device = ibdev; + uid = context ? to_mucontext(context)->devx_uid : 0; MLX5_SET(alloc_pd_in, in, opcode, MLX5_CMD_OP_ALLOC_PD); MLX5_SET(alloc_pd_in, in, uid, uid); err = mlx5_cmd_exec(to_mdev(ibdev)->mdev, in, sizeof(in), out, sizeof(out)); - if (err) { - kfree(pd); - return ERR_PTR(err); - } + if (err) + goto out; - pd->pdn = MLX5_GET(alloc_pd_out, out, pd); + pdn = MLX5_GET(alloc_pd_out, out, pd); pd->uid = uid; + rdma_rt_set_type(&pd->ibpd.res, RDMA_RESTRACK_PD); + rdma_rt_set_id(&pd->ibpd.res, pdn); + err = rdma_restrack_add(&pd->ibpd.res); + if (err) + goto out; + if (context) { - resp.pdn = pd->pdn; + resp.pdn = pdn; if (ib_copy_to_udata(udata, &resp, sizeof(resp))) { - mlx5_cmd_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn, uid); - kfree(pd); - return ERR_PTR(-EFAULT); + err = -EFAULT; + goto err_copy; } } return &pd->ibpd; + +err_copy: + mlx5_cmd_dealloc_pd(to_mdev(ibdev)->mdev, pdn, uid); + rdma_restrack_del(&pd->ibpd.res); + +out: kfree(pd); + return ERR_PTR(err); } static int mlx5_ib_dealloc_pd(struct ib_pd *pd) @@ -2296,7 +2309,8 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd) struct mlx5_ib_dev *mdev = to_mdev(pd->device); struct mlx5_ib_pd *mpd = to_mpd(pd); - mlx5_cmd_dealloc_pd(mdev->mdev, mpd->pdn, mpd->uid); + rdma_restrack_del(&pd->res); + mlx5_cmd_dealloc_pd(mdev->mdev, rdma_res_to_id(&pd->res), mpd->uid); kfree(mpd); return 0; @@ -4665,8 +4679,6 @@ static int create_dev_resources(struct mlx5_ib_resources *devr) ret = PTR_ERR(devr->p0); goto error0; } - devr->p0->device = &dev->ib_dev; - devr->p0->uobject = NULL; atomic_set(&devr->p0->usecnt, 0); devr->c0 = mlx5_ib_create_cq(&dev->ib_dev, &cq_attr, NULL, NULL); @@ -6513,6 +6525,9 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) if (!dev) return NULL; + /* PD ID managed by FW */ + rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_PD, 0, 0); + dev->mdev = mdev; dev->num_ports = max(MLX5_CAP_GEN(mdev, num_ports), MLX5_CAP_GEN(mdev, num_vhca_ports)); diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index cead0f97a7b1..8b235ceb9574 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -143,7 +143,6 @@ static inline struct mlx5_ib_ucontext *to_mucontext(struct ib_ucontext *ibuconte struct mlx5_ib_pd { struct ib_pd ibpd; - u32 pdn; u16 uid; }; diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 6d763d6a189f..8f557f90ad7f 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -800,7 +800,7 @@ struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc) MLX5_SET(mkc, mkc, lr, 1); MLX5_SET(mkc, mkc, length64, 1); - MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); + MLX5_SET(mkc, mkc, pd, rdma_res_to_id(&pd->res)); MLX5_SET(mkc, mkc, qpn, 0xffffff); MLX5_SET64(mkc, mkc, start_addr, 0); @@ -950,7 +950,7 @@ static struct mlx5_ib_mr *alloc_mr_from_cache( mr->desc_size = sizeof(struct mlx5_mtt); mr->mmkey.iova = virt_addr; mr->mmkey.size = len; - mr->mmkey.pd = to_mpd(pd)->pdn; + mr->mmkey.pd = rdma_res_to_id(&pd->res); return mr; } @@ -1171,7 +1171,7 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd, MLX5_SET64(mkc, mkc, start_addr, virt_addr); MLX5_SET64(mkc, mkc, len, length); - MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); + MLX5_SET(mkc, mkc, pd, rdma_res_to_id(&pd->res)); MLX5_SET(mkc, mkc, bsf_octword_size, 0); MLX5_SET(mkc, mkc, translations_octword_size, get_octo_len(virt_addr, length, page_shift)); @@ -1250,7 +1250,7 @@ static struct ib_mr *mlx5_ib_get_memic_mr(struct ib_pd *pd, u64 memic_addr, MLX5_SET(mkc, mkc, lr, 1); MLX5_SET64(mkc, mkc, len, length); - MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); + MLX5_SET(mkc, mkc, pd, rdma_res_to_id(&pd->res)); MLX5_SET(mkc, mkc, qpn, 0xffffff); MLX5_SET64(mkc, mkc, start_addr, memic_addr - pci_resource_start(dev->mdev->pdev, 0)); @@ -1525,7 +1525,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, mr->access_flags = access_flags; mr->mmkey.iova = addr; mr->mmkey.size = len; - mr->mmkey.pd = to_mpd(pd)->pdn; + mr->mmkey.pd = rdma_res_to_id(&pd->res); if (flags & IB_MR_REREG_TRANS) { upd_flags = MLX5_IB_UPD_XLT_ADDR; @@ -1703,7 +1703,7 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, MLX5_SET(mkc, mkc, free, 1); MLX5_SET(mkc, mkc, translations_octword_size, ndescs); MLX5_SET(mkc, mkc, qpn, 0xffffff); - MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); + MLX5_SET(mkc, mkc, pd, rdma_res_to_id(&pd->res)); if (mr_type == IB_MR_TYPE_MEM_REG) { mr->access_mode = MLX5_MKC_ACCESS_MODE_MTT; @@ -1736,7 +1736,7 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, } /* create mem & wire PSVs */ - err = mlx5_core_create_psv(dev->mdev, to_mpd(pd)->pdn, + err = mlx5_core_create_psv(dev->mdev, rdma_res_to_id(&pd->res), 2, psv_index); if (err) goto err_free_sig; @@ -1834,7 +1834,7 @@ struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type, MLX5_SET(mkc, mkc, free, 1); MLX5_SET(mkc, mkc, translations_octword_size, ndescs); - MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); + MLX5_SET(mkc, mkc, pd, rdma_res_to_id(&pd->res)); MLX5_SET(mkc, mkc, umr_en, 1); MLX5_SET(mkc, mkc, lr, 1); MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_KLMS); diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 529e76f67cb6..44bde8dfebf6 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -2038,11 +2038,13 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, MLX5_SET(qpc, qpc, st, mlx5_st); MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED); - if (init_attr->qp_type != MLX5_IB_QPT_REG_UMR) - MLX5_SET(qpc, qpc, pd, to_mpd(pd ? pd : devr->p0)->pdn); - else - MLX5_SET(qpc, qpc, latency_sensitive, 1); + if (init_attr->qp_type != MLX5_IB_QPT_REG_UMR) { + struct ib_pd *t = pd ? pd : devr->p0; + MLX5_SET(qpc, qpc, pd, rdma_res_to_id(&t->res)); + } else { + MLX5_SET(qpc, qpc, latency_sensitive, 1); + } if (qp->wq_sig) MLX5_SET(qpc, qpc, wq_signature, 1); @@ -2431,7 +2433,7 @@ static struct ib_qp *mlx5_ib_create_dct(struct ib_pd *pd, MLX5_SET(create_dct_in, qp->dct.in, uid, to_mpd(pd)->uid); dctc = MLX5_ADDR_OF(create_dct_in, qp->dct.in, dct_context_entry); qp->qp_sub_type = MLX5_IB_QPT_DCT; - MLX5_SET(dctc, dctc, pd, to_mpd(pd)->pdn); + MLX5_SET(dctc, dctc, pd, rdma_res_to_id(&pd->res)); MLX5_SET(dctc, dctc, srqn_xrqn, to_msrq(attr->srq)->msrq.srqn); MLX5_SET(dctc, dctc, cqn, to_mcq(attr->recv_cq)->mcq.cqn); MLX5_SET64(dctc, dctc, dc_access_key, ucmd->access_key); @@ -3357,7 +3359,9 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp, get_cqs(qp->ibqp.qp_type, qp->ibqp.send_cq, qp->ibqp.recv_cq, &send_cq, &recv_cq); - context->flags_pd = cpu_to_be32(pd ? pd->pdn : to_mpd(dev->devr.p0)->pdn); + context->flags_pd = + cpu_to_be32(pd ? rdma_res_to_id(&pd->ibpd.res) : + rdma_res_to_id(&dev->devr.p0->res)); context->cqn_send = send_cq ? cpu_to_be32(send_cq->mcq.cqn) : 0; context->cqn_recv = recv_cq ? cpu_to_be32(recv_cq->mcq.cqn) : 0; context->params1 = cpu_to_be32(MLX5_IB_ACK_REQ_FREQ << 28); @@ -4148,7 +4152,7 @@ static void set_reg_mkey_segment(struct mlx5_mkey_seg *seg, seg->flags = convert_access(umrwr->access_flags); if (umrwr->pd) - seg->flags_pd = cpu_to_be32(to_mpd(umrwr->pd)->pdn); + seg->flags_pd = cpu_to_be32(rdma_res_to_id(&umrwr->pd->res)); if (wr->send_flags & MLX5_IB_SEND_UMR_UPDATE_TRANSLATION && !umrwr->length) seg->flags_pd |= cpu_to_be32(MLX5_MKEY_LEN64); @@ -4495,7 +4499,7 @@ static int set_sig_umr_wr(const struct ib_send_wr *send_wr, { const struct ib_sig_handover_wr *wr = sig_handover_wr(send_wr); struct mlx5_ib_mr *sig_mr = to_mmr(wr->sig_mr); - u32 pdn = get_pd(qp)->pdn; + u32 pdn = rdma_res_to_id(&get_pd(qp)->ibpd.res); u32 xlt_size; int region_len, ret; @@ -5647,7 +5651,7 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd, MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES); } MLX5_SET(wq, wq, log_wq_sz, rwq->log_rq_size); - MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn); + MLX5_SET(wq, wq, pd, rdma_res_to_id(&pd->res)); MLX5_SET(wq, wq, page_offset, rwq->rq_page_offset); MLX5_SET(wq, wq, log_wq_pg_sz, rwq->log_page_size); MLX5_SET(wq, wq, wq_signature, rwq->wq_sig); diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c index 22bd774e0b4e..57c7df0dabdf 100644 --- a/drivers/infiniband/hw/mlx5/srq.c +++ b/drivers/infiniband/hw/mlx5/srq.c @@ -297,7 +297,7 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd, else in.cqn = to_mcq(dev->devr.c0)->mcq.cqn; - in.pd = to_mpd(pd)->pdn; + in.pd = rdma_res_to_id(&pd->res); in.db_record = srq->db.dma; err = mlx5_cmd_create_srq(dev, &srq->msrq, &in); kvfree(in.pas); From patchwork Sun Jan 20 13:05:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772391 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 84043746 for ; Sun, 20 Jan 2019 13:06:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 73FC62A6F1 for ; Sun, 20 Jan 2019 13:06:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 684932AA7D; Sun, 20 Jan 2019 13:06:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B2602A6F1 for ; Sun, 20 Jan 2019 13:06:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730588AbfATNGQ (ORCPT ); Sun, 20 Jan 2019 08:06:16 -0500 Received: from mail.kernel.org ([198.145.29.99]:36372 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNGP (ORCPT ); Sun, 20 Jan 2019 08:06:15 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 647C22133F; Sun, 20 Jan 2019 13:06:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989575; bh=WdT7yNckLPHp9wXBMCj5VDl3BwmvdIezLYIjhiQkL+I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f+WhlNoQas1IATu/eSoSOOsZrTm2y3qPztIOvQ+zzoj1Nvs10d7uCCucxE1wnO2Vk fL4UtSnutsTIOF8BhxXy3WC1pUPv57sTqqaGlmemuyDfaQvd2ywkZy7bpk+fVFD4qb Qe6pd587nMrh4mTFf1zuX2GjIF3mY2cJ34msN3Es= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 3/6] RDMA/mlx5: Use HW restrack CQ ID allocation mode Date: Sun, 20 Jan 2019 15:05:57 +0200 Message-Id: <20190120130600.8788-4-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Adapt mlx5 to use restrack HW ID allocation scheme. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/cq.c | 10 +++++++++- drivers/infiniband/hw/mlx5/main.c | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c index c283c32f30fe..202f977e7092 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -976,8 +976,15 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev, goto err_cmd; } - kvfree(cqb); + + cq->ibcq.device = ibdev; + rdma_rt_set_type(&cq->ibcq.res, RDMA_RESTRACK_CQ); + rdma_rt_set_id(&cq->ibcq.res, cq->mcq.cqn); + err = rdma_restrack_add(&cq->ibcq.res); + if (err) + goto err_cmd; + return &cq->ibcq; err_cmd: @@ -1012,6 +1019,7 @@ int mlx5_ib_destroy_cq(struct ib_cq *cq) else destroy_cq_kernel(dev, mcq); + rdma_restrack_del(&cq->res); kfree(mcq); return 0; diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 1348e4e9e119..3e1fb9d57724 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -6527,6 +6527,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) /* PD ID managed by FW */ rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_PD, 0, 0); + /* CQ ID managed by FW */ + rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_CQ, 0, 0); dev->mdev = mdev; dev->num_ports = max(MLX5_CAP_GEN(mdev, num_ports), From patchwork Sun Jan 20 13:05:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772393 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0CD21746 for ; Sun, 20 Jan 2019 13:06:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F0BBF2A6F1 for ; Sun, 20 Jan 2019 13:06:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E562B2AA7D; Sun, 20 Jan 2019 13:06:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 839E62A6F1 for ; Sun, 20 Jan 2019 13:06:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730585AbfATNGT (ORCPT ); Sun, 20 Jan 2019 08:06:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:36402 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNGT (ORCPT ); Sun, 20 Jan 2019 08:06:19 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9A4AC214C6; Sun, 20 Jan 2019 13:06:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989578; bh=OKwomUQNOARQ5fFCeBLBPQNmtk+Famt/NC7tdFYYO88=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CajSfC6BoHnFUIjA4JxAmhHxe4xWXy8Ip5xOBP8m9BALd68MgHtpgj8RlTutnN+ZA 3CoHWg4eHWjEcUJRz0BTExJz3Q7+Gcyrct3xFe70WSIm1DiAOFh9bVmXCvbEDGSqWK hCxI1QDRmUtYEAdWxbTLGkCwj1cgm8HpJyw9iSNQ= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 4/6] RDMA/mlx5: Use HW variant restrack QP ID allocation mode Date: Sun, 20 Jan 2019 15:05:58 +0200 Message-Id: <20190120130600.8788-5-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Adapt mlx5 to use restrack automatic QP allocation scheme and open create_qp callback to track all QP types except XRC. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/core_priv.h | 3 ++- drivers/infiniband/hw/mlx5/gsi.c | 5 ++++- drivers/infiniband/hw/mlx5/main.c | 2 ++ drivers/infiniband/hw/mlx5/qp.c | 17 +++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h index cda2db1add39..fc068f80f566 100644 --- a/drivers/infiniband/core/core_priv.h +++ b/drivers/infiniband/core/core_priv.h @@ -299,7 +299,8 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev, * see mlx5 create_dev_resources() as an example. */ rdma_rt_set_type(&qp->res, RDMA_RESTRACK_QP); - if (attr->qp_type < IB_QPT_XRC_INI) { + if (attr->qp_type != IB_QPT_XRC_INI && + attr->qp_type != IB_QPT_XRC_TGT) { if (uobj) rdma_restrack_uadd(&qp->res); else diff --git a/drivers/infiniband/hw/mlx5/gsi.c b/drivers/infiniband/hw/mlx5/gsi.c index 4950df3f71b6..0aeff7e3dbf6 100644 --- a/drivers/infiniband/hw/mlx5/gsi.c +++ b/drivers/infiniband/hw/mlx5/gsi.c @@ -193,9 +193,12 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd, } dev->devr.ports[init_attr->port_num - 1].gsi = gsi; - mutex_unlock(&dev->devr.mutex); + gsi->ibqp.device = &dev->ib_dev; + rdma_rt_set_type(&gsi->ibqp.res, RDMA_RESTRACK_QP); + rdma_rt_set_id(&gsi->ibqp.res, gsi->ibqp.qp_num); + return &gsi->ibqp; err_destroy_cq: diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 3e1fb9d57724..12a038146105 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -6529,6 +6529,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_PD, 0, 0); /* CQ ID managed by FW */ rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_CQ, 0, 0); + /* QP ID managed by HW */ + rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_QP, 0, 0); dev->mdev = mdev; dev->num_ports = max(MLX5_CAP_GEN(mdev, num_ports), diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 44bde8dfebf6..d18e2156d395 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -2444,6 +2444,13 @@ static struct ib_qp *mlx5_ib_create_dct(struct ib_pd *pd, qp->state = IB_QPS_RESET; + qp->ibqp.device = pd->device; + rdma_rt_set_type(&qp->ibqp.res, RDMA_RESTRACK_QP); + rdma_rt_set_id(&qp->ibqp.res, qp->ibqp.qp_num); + err = rdma_restrack_add(&qp->ibqp.res); + if (err) + goto err_free; + return &qp->ibqp; err_free: kfree(qp); @@ -2607,6 +2614,15 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, if (verbs_init_attr->qp_type == IB_QPT_DRIVER) qp->qp_sub_type = init_attr->qp_type; + qp->ibqp.device = &dev->ib_dev; + rdma_rt_set_type(&qp->ibqp.res, RDMA_RESTRACK_QP); + rdma_rt_set_id(&qp->ibqp.res, qp->ibqp.qp_num); + err = rdma_restrack_add(&qp->ibqp.res); + if (err) { + kfree(qp); + return ERR_PTR(err); + } + return &qp->ibqp; } @@ -2637,6 +2653,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp) if (unlikely(qp->qp_type == IB_QPT_GSI)) return mlx5_ib_gsi_destroy_qp(qp); + rdma_restrack_del(&qp->res); if (mqp->qp_sub_type == MLX5_IB_QPT_DCT) return mlx5_ib_destroy_dct(mqp); From patchwork Sun Jan 20 13:05:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772397 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0F4116C2 for ; Sun, 20 Jan 2019 13:06:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0001C2A6F1 for ; Sun, 20 Jan 2019 13:06:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E8AC22AA86; Sun, 20 Jan 2019 13:06:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E4DC2A6F1 for ; Sun, 20 Jan 2019 13:06:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730589AbfATNG0 (ORCPT ); Sun, 20 Jan 2019 08:06:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:36458 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNG0 (ORCPT ); Sun, 20 Jan 2019 08:06:26 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 04AD22087B; Sun, 20 Jan 2019 13:06:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989584; bh=7VgZiHTwyt1gRCecaMPa+4DAtkTAoEC0S1QRq9NUoyQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J3t8bVqe4VtKK+DdxAwIjWtEE0CeqYJwKAwAswEdSzGUz1OzypbXbFAXlBdiOOJiv losraEqP4XahqF+WLw6QrdGWTzaln4RD6Op4CkOiDBhZkZKLaBCy05YgcqEZdJ8nAu K/51UjSTWNGrimC8mg0pKi+Hw02nTHwpkOqzKzAM= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 5/6] RDMA/mlx5: Convert CTX to use restrack HW allocation scheme Date: Sun, 20 Jan 2019 15:05:59 +0200 Message-Id: <20190120130600.8788-6-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky ucontextes are limited by number of transport domain, which are counted and allocated by FW. Convert mlx5 code to use restrack HW allocation scheme to mange tdns. Signed-off-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/main.c | 23 ++++++++++++++++++++--- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 -- drivers/infiniband/hw/mlx5/qp.c | 5 ++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 12a038146105..e662b575807c 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -1667,6 +1667,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, struct mlx5_core_dev *mdev = dev->mdev; struct mlx5_ib_ucontext *context; struct mlx5_bfreg_info *bfregi; + u32 tdn; int ver; int err; size_t min_req_v2 = offsetof(struct mlx5_ib_alloc_ucontext_req_v2, @@ -1774,7 +1775,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, context->devx_uid = err; } - err = mlx5_ib_alloc_transport_domain(dev, &context->tdn, + err = mlx5_ib_alloc_transport_domain(dev, &tdn, context->devx_uid); if (err) goto out_devx; @@ -1850,6 +1851,8 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, resp.response_length += sizeof(resp.dump_fill_mkey); } + + err = ib_copy_to_udata(udata, &resp, resp.response_length); if (err) goto out_mdev; @@ -1868,10 +1871,19 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, 1, &dev->roce[port].tx_port_affinity)); } + context->ibucontext.device = ibdev; + rdma_rt_set_type(&context->ibucontext.res, RDMA_RESTRACK_CTX); + rdma_rt_set_id(&context->ibucontext.res, tdn); + err = rdma_restrack_add(&context->ibucontext.res); + if (err) + goto out_mdev; + return &context->ibucontext; out_mdev: - mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid); + mlx5_ib_dealloc_transport_domain( + dev, rdma_res_to_id(&context->ibucontext.res), + context->devx_uid); out_devx: if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) mlx5_ib_devx_destroy(dev, context->devx_uid); @@ -1903,7 +1915,10 @@ static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext) mutex_unlock(&ibcontext->per_mm_list_lock); bfregi = &context->bfregi; - mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid); + rdma_restrack_del(&context->ibucontext.res); + mlx5_ib_dealloc_transport_domain( + dev, rdma_res_to_id(&context->ibucontext.res), + context->devx_uid); if (context->devx_uid) mlx5_ib_devx_destroy(dev, context->devx_uid); @@ -6531,6 +6546,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_CQ, 0, 0); /* QP ID managed by HW */ rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_QP, 0, 0); + /* context are managed by TDN */ + rdma_rt_set_id_range(&dev->ib_dev, RDMA_RESTRACK_CTX, 0, 0); dev->mdev = mdev; dev->num_ports = max(MLX5_CAP_GEN(mdev, num_ports), diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index 8b235ceb9574..1f1dd19c9d85 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -126,8 +126,6 @@ struct mlx5_ib_ucontext { struct mutex db_page_mutex; struct mlx5_bfreg_info bfregi; u8 cqe_version; - /* Transport Domain number */ - u32 tdn; u64 lib_caps; DECLARE_BITMAP(dm_pages, MLX5_MAX_MEMIC_PAGES); diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index d18e2156d395..dba75b96f971 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -1360,9 +1360,8 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, struct mlx5_ib_rq *rq = &raw_packet_qp->rq; struct ib_uobject *uobj = pd->uobject; struct ib_ucontext *ucontext = uobj->context; - struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext); int err; - u32 tdn = mucontext->tdn; + u32 tdn = rdma_res_to_id(&ucontext->res); u16 uid = to_mpd(pd)->uid; if (qp->sq.wqe_cnt) { @@ -1486,7 +1485,7 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, u32 selected_fields = 0; u32 outer_l4; size_t min_resp_len; - u32 tdn = mucontext->tdn; + u32 tdn = rdma_res_to_id(&ucontext->res); struct mlx5_ib_create_qp_rss ucmd = {}; size_t required_cmd_sz; u8 lb_flag = 0; From patchwork Sun Jan 20 13:06:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 10772395 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2285C6C2 for ; Sun, 20 Jan 2019 13:06:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 122882A6F1 for ; Sun, 20 Jan 2019 13:06:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 066DD2AA7D; Sun, 20 Jan 2019 13:06:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 94B802A6F1 for ; Sun, 20 Jan 2019 13:06:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730589AbfATNGW (ORCPT ); Sun, 20 Jan 2019 08:06:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:36428 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730542AbfATNGW (ORCPT ); Sun, 20 Jan 2019 08:06:22 -0500 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id CF9972087B; Sun, 20 Jan 2019 13:06:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1547989581; bh=rxEER+umiDIqDfkMXb4Xh1Ho1MvsR8pBRdHJr8d9VVo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FrhdaRz7HesxJpDcFjiDqo8Tus0UUBW5lenmPoeJlar3nBGE2rfwowZ+1sMt6pLwD PesKhYHG3S3+XachUazSIghIpJ6quLkQbKaGl/XZwKzB1kHDDkxj3jUA+lI1vi+xRJ Sn++5ccXLZyjHojFSK3H6BQ9jQ6Ko1G49CKdyFLA= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next v1 6/6] RDMA/mlx5: Annotate MR allocation Date: Sun, 20 Jan 2019 15:06:00 +0200 Message-Id: <20190120130600.8788-7-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190120130600.8788-1-leon@kernel.org> References: <20190120130600.8788-1-leon@kernel.org> MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Use restrack ID ability to track MRs. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/verbs.c | 2 ++ drivers/infiniband/hw/mlx5/mr.c | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 0a85bb2c3408..fb4b0ac85c09 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -287,6 +287,8 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags, ib_dealloc_pd(pd); return ERR_CAST(mr); } + rdma_restrack_set_task(&mr->res, caller); + rdma_restrack_kadd(&mr->res); mr->device = pd->device; mr->pd = pd; diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 8f557f90ad7f..4d374846eaf6 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -198,6 +198,7 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num) mr->order = ent->order; mr->allocated_from_cache = 1; mr->dev = dev; + mr->ibmr.device = &dev->ib_dev; MLX5_SET(mkc, mkc, free, 1); MLX5_SET(mkc, mkc, umr_en, 1); @@ -812,10 +813,15 @@ struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc) mr->mmkey.type = MLX5_MKEY_MR; mr->ibmr.lkey = mr->mmkey.key; mr->ibmr.rkey = mr->mmkey.key; - mr->umem = NULL; + mr->ibmr.device = pd->device; + rdma_rt_set_type(&mr->ibmr.res, RDMA_RESTRACK_MR); + err = rdma_restrack_add(&mr->ibmr.res); + if (err) + goto err_rt; return &mr->ibmr; +err_rt: mlx5_core_destroy_mkey(mdev, &mr->mmkey); err_in: kfree(in); @@ -1673,6 +1679,7 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) int mlx5_ib_dereg_mr(struct ib_mr *ibmr) { + rdma_restrack_del(&ibmr->res); dereg_mr(to_mdev(ibmr->device), to_mmr(ibmr)); return 0; } @@ -1693,6 +1700,13 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, if (!mr) return ERR_PTR(-ENOMEM); + mr->ibmr.device = pd->device; + rdma_rt_set_type(&mr->ibmr.res, RDMA_RESTRACK_MR); + err = rdma_restrack_add(&mr->ibmr.res); + if (err) + goto err_rt; + + in = kzalloc(inlen, GFP_KERNEL); if (!in) { err = -ENOMEM; @@ -1789,6 +1803,8 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, err_free_in: kfree(in); err_free: + rdma_restrack_del(&mr->ibmr.res); +err_rt: kfree(mr); return ERR_PTR(err); }