mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
RDMA/hns: Limit extend sq sge num
According to hip08 limit, the buffer size of extend sge needs to be an integer wqe_sge_buf_page size. For example, the value of sge_shift field of qp context is greater or equal to eight when buffer page size is 4K size. The value of sge_shift field of qp context assigned by hr_qp->sge.sge_cnt. Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
3a63c964ea
commit
b28ca7ccef
@ -344,6 +344,7 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
{
|
{
|
||||||
u32 roundup_sq_stride = roundup_pow_of_two(hr_dev->caps.max_sq_desc_sz);
|
u32 roundup_sq_stride = roundup_pow_of_two(hr_dev->caps.max_sq_desc_sz);
|
||||||
u8 max_sq_stride = ilog2(roundup_sq_stride);
|
u8 max_sq_stride = ilog2(roundup_sq_stride);
|
||||||
|
u32 ex_sge_num;
|
||||||
u32 page_size;
|
u32 page_size;
|
||||||
u32 max_cnt;
|
u32 max_cnt;
|
||||||
|
|
||||||
@ -384,6 +385,7 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
hr_qp->sge.sge_shift = 4;
|
hr_qp->sge.sge_shift = 4;
|
||||||
|
ex_sge_num = hr_qp->sge.sge_cnt;
|
||||||
|
|
||||||
/* Get buf size, SQ and RQ are aligned to page_szie */
|
/* Get buf size, SQ and RQ are aligned to page_szie */
|
||||||
if (hr_dev->caps.max_sq_sg <= 2) {
|
if (hr_dev->caps.max_sq_sg <= 2) {
|
||||||
@ -397,6 +399,8 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
hr_qp->sq.wqe_shift), PAGE_SIZE);
|
hr_qp->sq.wqe_shift), PAGE_SIZE);
|
||||||
} else {
|
} else {
|
||||||
page_size = 1 << (hr_dev->caps.mtt_buf_pg_sz + PAGE_SHIFT);
|
page_size = 1 << (hr_dev->caps.mtt_buf_pg_sz + PAGE_SHIFT);
|
||||||
|
hr_qp->sge.sge_cnt =
|
||||||
|
max(page_size / (1 << hr_qp->sge.sge_shift), ex_sge_num);
|
||||||
hr_qp->buff_size = HNS_ROCE_ALOGN_UP((hr_qp->rq.wqe_cnt <<
|
hr_qp->buff_size = HNS_ROCE_ALOGN_UP((hr_qp->rq.wqe_cnt <<
|
||||||
hr_qp->rq.wqe_shift), page_size) +
|
hr_qp->rq.wqe_shift), page_size) +
|
||||||
HNS_ROCE_ALOGN_UP((hr_qp->sge.sge_cnt <<
|
HNS_ROCE_ALOGN_UP((hr_qp->sge.sge_cnt <<
|
||||||
@ -405,7 +409,7 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
hr_qp->sq.wqe_shift), page_size);
|
hr_qp->sq.wqe_shift), page_size);
|
||||||
|
|
||||||
hr_qp->sq.offset = 0;
|
hr_qp->sq.offset = 0;
|
||||||
if (hr_qp->sge.sge_cnt) {
|
if (ex_sge_num) {
|
||||||
hr_qp->sge.offset = HNS_ROCE_ALOGN_UP(
|
hr_qp->sge.offset = HNS_ROCE_ALOGN_UP(
|
||||||
(hr_qp->sq.wqe_cnt <<
|
(hr_qp->sq.wqe_cnt <<
|
||||||
hr_qp->sq.wqe_shift),
|
hr_qp->sq.wqe_shift),
|
||||||
@ -491,6 +495,8 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
page_size);
|
page_size);
|
||||||
|
|
||||||
if (hr_dev->caps.max_sq_sg > 2 && hr_qp->sge.sge_cnt) {
|
if (hr_dev->caps.max_sq_sg > 2 && hr_qp->sge.sge_cnt) {
|
||||||
|
hr_qp->sge.sge_cnt = max(page_size/(1 << hr_qp->sge.sge_shift),
|
||||||
|
(u32)hr_qp->sge.sge_cnt);
|
||||||
hr_qp->sge.offset = size;
|
hr_qp->sge.offset = size;
|
||||||
size += HNS_ROCE_ALOGN_UP(hr_qp->sge.sge_cnt <<
|
size += HNS_ROCE_ALOGN_UP(hr_qp->sge.sge_cnt <<
|
||||||
hr_qp->sge.sge_shift, page_size);
|
hr_qp->sge.sge_shift, page_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user