From: Jason Gunthorpe <jgg@nvidia.com>
To: Leon Romanovsky <leon@kernel.org>
Cc: Doug Ledford <dledford@redhat.com>,
Leon Romanovsky <leonro@nvidia.com>,
Adit Ranadive <aditr@vmware.com>,
Ariel Elior <aelior@marvell.com>,
"Bernard Metzler" <bmt@zurich.ibm.com>,
Christian Benvenuti <benve@cisco.com>,
"Dennis Dalessandro" <dennis.dalessandro@intel.com>,
Devesh Sharma <devesh.sharma@broadcom.com>,
Faisal Latif <faisal.latif@intel.com>,
"Gal Pressman" <galpress@amazon.com>,
Leon Romanovsky <leonro@mellanox.com>,
Lijun Ou <oulijun@huawei.com>, <linux-kernel@vger.kernel.org>,
<linux-rdma@vger.kernel.org>,
Michal Kalderon <mkalderon@marvell.com>,
"Mike Marciniszyn" <mike.marciniszyn@intel.com>,
Naresh Kumar PBS <nareshkumar.pbs@broadcom.com>,
Nelson Escobar <neescoba@cisco.com>,
"Parvi Kaustubhi" <pkaustub@cisco.com>,
Potnuri Bharat Teja <bharat@chelsio.com>,
Selvin Xavier <selvin.xavier@broadcom.com>,
Shiraz Saleem <shiraz.saleem@intel.com>,
Somnath Kotur <somnath.kotur@broadcom.com>,
Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>,
VMware PV-Drivers <pv-drivers@vmware.com>,
Weihang Li <liweihang@huawei.com>,
"Wei Hu(Xavier)" <huwei87@hisilicon.com>,
Yishai Hadas <yishaih@nvidia.com>,
Yuval Shaia <yuval.shaia@oracle.com>,
Zhu Yanjun <yanjunz@nvidia.com>
Subject: Re: [PATCH rdma-next v2 0/9] Restore failure of destroy commands
Date: Wed, 9 Sep 2020 15:06:07 -0300 [thread overview]
Message-ID: <20200909180607.GA916941@nvidia.com> (raw)
In-Reply-To: <20200907120921.476363-1-leon@kernel.org>
On Mon, Sep 07, 2020 at 03:09:12PM +0300, Leon Romanovsky wrote:
> From: Leon Romanovsky <leonro@nvidia.com>
>
> Changelog:
> v2:
> * Rebased on top of the 524d8ffd07f0
> * Removed "udata" check in destroy flows
> * Changed ib_free_cq to return early
> * Used Jason's suggestion to implement "RDMA/mlx5: Issue FW command to destroy
> SRQ on reentry" patch.
> v1
> * Changed returned value in efa_destroy_ah() from EINVAL to EOPNOTSUPP
> * https://lore.kernel.org/lkml/20200830084010.102381-1-leon@kernel.org
> v0:
> * https://lore.kernel.org/lkml/20200824103247.1088464-1-leon@kernel.org
>
> Hi,
>
> This series restores the ability to fail on destroy commands, due to the
> fact that mlx5_ib DEVX implementation interleaved ib_core objects
> with FW objects without sharing reference counters.
>
> In retrospect, every part of the mlx5_ib flow is correct.
>
> It started from IBTA which was written by HW engineers with HW in mind and
> they allowed to fail in destruction. FW implemented it with symmetrical
> interface like any other command and propagated error back to the kernel,
> which forwarded it to the libibverbs and kernel ULPs.
>
> Libibverbs was designed with IBTA spec in hand putting destroy errors in
> stone. Up till mlx5_ib DEVX, it worked well, because the IB verbs objects
> are counted by the kernel and ib_core ensures that FW destroy will success
> by managing various reference counters on such objects.
>
> The extension of the mlx5 driver changed this flow when allowed DEVX objects
> that are not managed by ib_core to be interleaved with the ones under ib_core
> responsibility.
>
> The drivers that want to implement DEVX flows must ensure that FW/HW
> destroys are performed as early as possible before any other internal
> cleanup. After HW destroys, drivers are not allowed to fail.
>
> This series includes two patches (WQ and "potential race") that will
> require extra work in mlx5_ib, they both theoretical. WQ is not in use
> in DEVX, but is needed to make interface symmetrical to other objects.
> "Potential race" is in ULP flow that ensures that SRQ is destroyed in
> proper order.
>
> Thanks
>
> Leon Romanovsky (9):
> RDMA: Restore ability to fail on PD deallocate
> RDMA: Restore ability to fail on AH destroy
> RDMA/mlx5: Issue FW command to destroy SRQ on reentry
> RDMA: Restore ability to fail on SRQ destroy
> RDMA/core: Delete function indirection for alloc/free kernel CQ
> RDMA: Allow fail of destroy CQ
> RDMA: Change XRCD destroy return value
> RDMA: Restore ability to return error for destroy WQ
> RDMA: Make counters destroy symmetrical
Thanks, applied to for-next with the changes I noted:
diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
index b2381e01bf6345..35e5bbb44d3d8e 100644
--- a/drivers/infiniband/hw/mlx5/cq.c
+++ b/drivers/infiniband/hw/mlx5/cq.c
@@ -1031,15 +1031,14 @@ int mlx5_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
int ret;
ret = mlx5_core_destroy_cq(dev->mdev, &mcq->mcq);
- if (ret && udata)
+ if (ret)
return ret;
- if (udata) {
+ if (udata)
destroy_cq_user(mcq, udata);
- return 0;
- }
- destroy_cq_kernel(dev, mcq);
- return ret;
+ else
+ destroy_cq_kernel(dev, mcq);
+ return 0;
}
static int is_equal_rsn(struct mlx5_cqe64 *cqe64, u32 rsn)
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 039f55fd067640..6dfdc13bc36395 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -5092,11 +5092,11 @@ int mlx5_ib_destroy_wq(struct ib_wq *wq, struct ib_udata *udata)
int ret;
ret = mlx5_core_destroy_rq_tracked(dev, &rwq->core_qp);
- if (ret && udata)
+ if (ret)
return ret;
destroy_user_rq(dev, wq->pd, rwq, udata);
kfree(rwq);
- return ret;
+ return 0;
}
struct ib_rwq_ind_table *mlx5_ib_create_rwq_ind_table(struct ib_device *device,
diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c
index 6789b8a6927467..e2f720eec1e18b 100644
--- a/drivers/infiniband/hw/mlx5/srq.c
+++ b/drivers/infiniband/hw/mlx5/srq.c
@@ -396,17 +396,14 @@ int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
int ret;
ret = mlx5_cmd_destroy_srq(dev, &msrq->msrq);
- if (ret && udata)
+ if (ret)
return ret;
- if (udata) {
+ if (udata)
destroy_srq_user(srq->pd, msrq, udata);
- return 0;
- }
-
- /* We are cleaning kernel resources anyway */
- destroy_srq_kernel(dev, msrq);
- return ret;
+ else
+ destroy_srq_kernel(dev, msrq);
+ return 0;
}
void mlx5_ib_free_srq_wqe(struct mlx5_ib_srq *srq, int wqe_index)
diff --git a/drivers/infiniband/hw/mlx5/srq_cmd.c b/drivers/infiniband/hw/mlx5/srq_cmd.c
index 1a707c2d364c1f..db889ec3fd48e8 100644
--- a/drivers/infiniband/hw/mlx5/srq_cmd.c
+++ b/drivers/infiniband/hw/mlx5/srq_cmd.c
@@ -598,7 +598,7 @@ int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
/* Delete entry, but leave index occupied */
tmp = xa_cmpxchg_irq(&table->array, srq->srqn, srq, XA_ZERO_ENTRY, 0);
- if (WARN_ON(!tmp || tmp != srq) || xa_err(tmp))
+ if (WARN_ON(tmp != srq))
return xa_err(tmp) ?: -EINVAL;
err = destroy_srq_split(dev, srq);
Jason
next prev parent reply other threads:[~2020-09-09 18:06 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-07 12:09 [PATCH rdma-next v2 0/9] Restore failure of destroy commands Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 1/9] RDMA: Restore ability to fail on PD deallocate Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 2/9] RDMA: Restore ability to fail on AH destroy Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 3/9] RDMA/mlx5: Issue FW command to destroy SRQ on reentry Leon Romanovsky
2020-09-08 18:50 ` Jason Gunthorpe
2020-09-07 12:09 ` [PATCH rdma-next v2 4/9] RDMA: Restore ability to fail on SRQ destroy Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 5/9] RDMA/core: Delete function indirection for alloc/free kernel CQ Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 6/9] RDMA: Allow fail of destroy CQ Leon Romanovsky
2020-09-08 18:55 ` Jason Gunthorpe
2020-09-07 12:09 ` [PATCH rdma-next v2 7/9] RDMA: Change XRCD destroy return value Leon Romanovsky
2020-09-07 12:09 ` [PATCH rdma-next v2 8/9] RDMA: Restore ability to return error for destroy WQ Leon Romanovsky
2020-09-08 18:56 ` Jason Gunthorpe
2020-09-07 12:09 ` [PATCH rdma-next v2 9/9] RDMA: Make counters destroy symmetrical Leon Romanovsky
2020-09-09 18:06 ` Jason Gunthorpe [this message]
2020-09-10 12:24 ` [PATCH rdma-next v2 0/9] Restore failure of destroy commands Leon Romanovsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200909180607.GA916941@nvidia.com \
--to=jgg@nvidia.com \
--cc=aditr@vmware.com \
--cc=aelior@marvell.com \
--cc=benve@cisco.com \
--cc=bharat@chelsio.com \
--cc=bmt@zurich.ibm.com \
--cc=dennis.dalessandro@intel.com \
--cc=devesh.sharma@broadcom.com \
--cc=dledford@redhat.com \
--cc=faisal.latif@intel.com \
--cc=galpress@amazon.com \
--cc=huwei87@hisilicon.com \
--cc=leon@kernel.org \
--cc=leonro@mellanox.com \
--cc=leonro@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=liweihang@huawei.com \
--cc=mike.marciniszyn@intel.com \
--cc=mkalderon@marvell.com \
--cc=nareshkumar.pbs@broadcom.com \
--cc=neescoba@cisco.com \
--cc=oulijun@huawei.com \
--cc=pkaustub@cisco.com \
--cc=pv-drivers@vmware.com \
--cc=selvin.xavier@broadcom.com \
--cc=shiraz.saleem@intel.com \
--cc=somnath.kotur@broadcom.com \
--cc=sriharsha.basavapatna@broadcom.com \
--cc=yanjunz@nvidia.com \
--cc=yishaih@nvidia.com \
--cc=yuval.shaia@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.