Commit 7f360a7e authored by Luoyouming's avatar Luoyouming Committed by Zheng Zengkai
Browse files

RDMA/hns: Fix ext_sge num error when post send

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5USIG



-----------------------------------------------------------

The max_gs is the sum of extended sge and standard sge. In function
fill_ext_sge_inl_data, max_gs does not subtract the number of extended
sges, but is directly used to calculate the size of extended sges.

Signed-off-by: default avatarLuoyouming <luoyouming@huawei.com>
Reviewed-by: default avatarYangyang Li <liyangyang20@huawei.com>
Reviewed-by: default avatarYueHaibing <yuehaibing@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent bb89e8ac
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -188,20 +188,29 @@ static void set_atomic_seg(const struct ib_send_wr *wr,
	hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SGE_NUM, valid_num_sge);
}

static unsigned int get_std_sge_num(struct hns_roce_qp *qp)
{
	if (qp->ibqp.qp_type == IB_QPT_GSI || qp->ibqp.qp_type == IB_QPT_UD)
		return 0;

	return HNS_ROCE_SGE_IN_WQE;
}

static int fill_ext_sge_inl_data(struct hns_roce_qp *qp,
				 const struct ib_send_wr *wr,
				 unsigned int *sge_idx, u32 msg_len)
{
	struct ib_device *ibdev = &(to_hr_dev(qp->ibqp.device))->ib_dev;
	unsigned int ext_sge_sz = qp->sq.max_gs * HNS_ROCE_SGE_SIZE;
	unsigned int left_len_in_pg;
	unsigned int idx = *sge_idx;
	unsigned int std_sge_num;
	unsigned int i = 0;
	unsigned int len;
	void *addr;
	void *dseg;

	if (msg_len > ext_sge_sz) {
	std_sge_num = get_std_sge_num(qp);
	if (msg_len > (qp->sq.max_gs - std_sge_num) * HNS_ROCE_SGE_SIZE) {
		ibdev_err(ibdev,
			  "no enough extended sge space for inline data.\n");
		return -EINVAL;