diff options
author | oulijun <oulijun@huawei.com> | 2018-01-03 10:44:06 +0800 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2018-01-03 13:58:59 -0700 |
commit | 52e3b42a2f587912f0558cd4989da160d8b1304a (patch) | |
tree | 315667fc366115fc14d739adee5091cf8e6aee27 /drivers/infiniband | |
parent | ace1c5416b37bc9d925f91ee163c47fa6aa16781 (diff) | |
download | op-kernel-dev-52e3b42a2f587912f0558cd4989da160d8b1304a.zip op-kernel-dev-52e3b42a2f587912f0558cd4989da160d8b1304a.tar.gz |
RDMA/hns: Filter for zero length of sge in hip08 kernel mode
When the length of sge is zero, the driver need to filter it
Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index ea966cc..4c37f43 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -230,26 +230,37 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, V2_RC_SEND_WQE_BYTE_4_INLINE_S, 1); } else { if (wr->num_sge <= 2) { - for (i = 0; i < wr->num_sge; i++) - set_data_seg_v2(dseg + i, - wr->sg_list + i); + for (i = 0; i < wr->num_sge; i++) { + if (likely(wr->sg_list[i].length)) { + set_data_seg_v2(dseg, + wr->sg_list + i); + dseg++; + } + } } else { roce_set_field(rc_sq_wqe->byte_20, V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M, V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S, sge_ind & (qp->sge.sge_cnt - 1)); - for (i = 0; i < 2; i++) - set_data_seg_v2(dseg + i, - wr->sg_list + i); + for (i = 0; i < 2; i++) { + if (likely(wr->sg_list[i].length)) { + set_data_seg_v2(dseg, + wr->sg_list + i); + dseg++; + } + } dseg = get_send_extend_sge(qp, sge_ind & (qp->sge.sge_cnt - 1)); for (i = 0; i < wr->num_sge - 2; i++) { - set_data_seg_v2(dseg + i, - wr->sg_list + 2 + i); - sge_ind++; + if (likely(wr->sg_list[i + 2].length)) { + set_data_seg_v2(dseg, + wr->sg_list + 2 + i); + dseg++; + sge_ind++; + } } } |