RDMA/i40iw: Fix for using one sge for RDMA READ
authorShiraz Saleem <[email protected]>
Fri, 22 Apr 2016 19:14:27 +0000 (14:14 -0500)
committerDoug Ledford <[email protected]>
Thu, 28 Apr 2016 20:32:55 +0000 (16:32 -0400)
A check is added to validate the requested sge number.
iWARP doesn't support multiple sg elements for
RDMA READ work requests.

Signed-off-by: Tatyana Nikolova <[email protected]>
Signed-off-by: Faisal Latif <[email protected]>
Signed-off-by: Doug Ledford <[email protected]>
drivers/infiniband/hw/i40iw/i40iw_verbs.c

index 2d832c758c66df7d6f69ec3fb990bd0bd31e4540..45f70f5e14a782cf368dd192bd25c43e8362962b 100644 (file)
@@ -74,7 +74,7 @@ static int i40iw_query_device(struct ib_device *ibdev,
        props->max_cqe = iwdev->max_cqe;
        props->max_mr = iwdev->max_mr;
        props->max_pd = iwdev->max_pd;
-       props->max_sge_rd = 1;
+       props->max_sge_rd = I40IW_MAX_SGE_RD;
        props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE;
        props->max_qp_init_rd_atom = props->max_qp_rd_atom;
        props->atomic_cap = IB_ATOMIC_NONE;
@@ -2117,6 +2117,10 @@ static int i40iw_post_send(struct ib_qp *ibqp,
                        inv_stag = true;
                        /* fall-through*/
                case IB_WR_RDMA_READ:
+                       if (ib_wr->num_sge > I40IW_MAX_SGE_RD) {
+                               err = -EINVAL;
+                               break;
+                       }
                        info.op_type = I40IW_OP_TYPE_RDMA_READ;
                        info.op.rdma_read.rem_addr.tag_off = rdma_wr(ib_wr)->remote_addr;
                        info.op.rdma_read.rem_addr.stag = rdma_wr(ib_wr)->rkey;