| From 09ce351dff8e7636af0beb72cd4a86c3904a0500 Mon Sep 17 00:00:00 2001 |
| From: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Date: Thu, 17 Jan 2019 12:42:16 -0800 |
| Subject: IB/hfi1: Add limit test for RC/UC send via loopback |
| |
| From: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| |
| commit 09ce351dff8e7636af0beb72cd4a86c3904a0500 upstream. |
| |
| Fix potential memory corruption and panic in loopback for IB_WR_SEND |
| variants. |
| |
| The code blindly assumes the posted length will fit in the fetched rwqe, |
| which is not a valid assumption. |
| |
| Fix by adding a limit test, and triggering the appropriate send completion |
| and putting the QP in an error state. This mimics the handling for |
| non-loopback QPs. |
| |
| Fixes: 15703461533a ("IB/{hfi1, qib, rdmavt}: Move ruc_loopback to rdmavt") |
| Cc: <stable@vger.kernel.org> #v4.20+ |
| Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com> |
| Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| |
| --- |
| drivers/infiniband/hw/hfi1/ruc.c | 7 ++++++- |
| drivers/infiniband/hw/qib/qib_ruc.c | 7 ++++++- |
| 2 files changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/infiniband/hw/hfi1/ruc.c |
| +++ b/drivers/infiniband/hw/hfi1/ruc.c |
| @@ -440,6 +440,8 @@ send: |
| goto op_err; |
| if (!ret) |
| goto rnr_nak; |
| + if (wqe->length > qp->r_len) |
| + goto inv_err; |
| break; |
| |
| case IB_WR_RDMA_WRITE_WITH_IMM: |
| @@ -607,7 +609,10 @@ op_err: |
| goto err; |
| |
| inv_err: |
| - send_status = IB_WC_REM_INV_REQ_ERR; |
| + send_status = |
| + sqp->ibqp.qp_type == IB_QPT_RC ? |
| + IB_WC_REM_INV_REQ_ERR : |
| + IB_WC_SUCCESS; |
| wc.status = IB_WC_LOC_QP_OP_ERR; |
| goto err; |
| |
| --- a/drivers/infiniband/hw/qib/qib_ruc.c |
| +++ b/drivers/infiniband/hw/qib/qib_ruc.c |
| @@ -425,6 +425,8 @@ again: |
| goto op_err; |
| if (!ret) |
| goto rnr_nak; |
| + if (wqe->length > qp->r_len) |
| + goto inv_err; |
| break; |
| |
| case IB_WR_RDMA_WRITE_WITH_IMM: |
| @@ -585,7 +587,10 @@ op_err: |
| goto err; |
| |
| inv_err: |
| - send_status = IB_WC_REM_INV_REQ_ERR; |
| + send_status = |
| + sqp->ibqp.qp_type == IB_QPT_RC ? |
| + IB_WC_REM_INV_REQ_ERR : |
| + IB_WC_SUCCESS; |
| wc.status = IB_WC_LOC_QP_OP_ERR; |
| goto err; |
| |