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;