Re: [PATCH for-next] RDMA/hns: Support to set mininum depth of qp to 0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2020/3/9 23:18, Leon Romanovsky wrote:
On Mon, Mar 02, 2020 at 05:22:17PM +0800, Weihang Li wrote:
From: Lang Cheng <chenglang@xxxxxxxxxx>

Minimum depth of qp should be allowed to be set to 0 according to the
firmware configuration. And when qp is changed from reset to reset, the
capability of minimum qp depth was used to identify hardware of hip06,
it should be changed into a more readable form.


And what does it mean "qp depth == 0"?


Here are 2 related test cases can be executed successfully:
1,Just create qp with 0-depth sq and 0-depth rq, but do not perform sending and receiving.
2. Create a qp with 0-depth rq, the send operation can be completed.

Perhaps supporting 0-depth qp would provide some flexibility for some features.

Or should we return error when ULP try to create a 0-depth queue?




Signed-off-by: Lang Cheng <chenglang@xxxxxxxxxx>
Signed-off-by: Weihang Li <liweihang@xxxxxxxxxx>
---
  drivers/infiniband/hw/hns/hns_roce_qp.c | 13 ++++++-------
  1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index 2a75355..10c4354 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -382,10 +382,10 @@ static int set_rq_size(struct hns_roce_dev *hr_dev,
  			return -EINVAL;
  		}

-		if (hr_dev->caps.min_wqes)
+		if (cap->max_recv_wr)
  			max_cnt = max(cap->max_recv_wr, hr_dev->caps.min_wqes);
  		else
-			max_cnt = cap->max_recv_wr;
+			max_cnt = 0;

It is basically the same thing: cap->max_recv_wr == 0.

The current firmware has not specified the minimum depth of qp, resulting in hr_dev-> caps.min_wqes always being 0, the process will always go into the else branch, so there is no minimum depth check for qp.

The firmware will support configuring the minimum depth of qp, so this patch checks all the use of this caps.



  		hr_qp->rq.wqe_cnt = roundup_pow_of_two(max_cnt);

@@ -652,10 +652,10 @@ static int set_kernel_sq_size(struct hns_roce_dev *hr_dev,

  	hr_qp->sq.wqe_shift = ilog2(hr_dev->caps.max_sq_desc_sz);

-	if (hr_dev->caps.min_wqes)
+	if (cap->max_send_wr)
  		max_cnt = max(cap->max_send_wr, hr_dev->caps.min_wqes);
  	else
-		max_cnt = cap->max_send_wr;
+		max_cnt = 0;

Ditto


  	hr_qp->sq.wqe_cnt = roundup_pow_of_two(max_cnt);
  	if ((u32)hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes) {
@@ -1394,11 +1394,10 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
  		goto out;

  	if (cur_state == new_state && cur_state == IB_QPS_RESET) {
-		if (hr_dev->caps.min_wqes) {
+		if (hr_dev->hw_rev == HNS_ROCE_HW_VER1) {
  			ret = -EPERM;
  			ibdev_err(&hr_dev->ib_dev,
-				"cur_state=%d new_state=%d\n", cur_state,
-				new_state);
+				  "Unsupport to modify qp from reset to reset\n");

"RST2RST state is not supported\n"

Will be modified in next, thanks.



  		} else {
  			ret = 0;
  		}
--
2.8.1


.





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux