On 2023/12/26 16:52, Leon Romanovsky wrote: > On Mon, Dec 25, 2023 at 03:53:28PM +0800, Junxian Huang wrote: >> From: Chengchang Tang <tangchengchang@xxxxxxxxxx> >> >> In the current implementation, a fixed page size is used to >> configure the PBL, which is not flexible enough and is not >> conducive to the performance of the HW. >> >> Signed-off-by: Chengchang Tang <tangchengchang@xxxxxxxxxx> >> Signed-off-by: Junxian Huang <huangjunxian6@xxxxxxxxxxxxx> >> --- >> drivers/infiniband/hw/hns/hns_roce_alloc.c | 6 - >> drivers/infiniband/hw/hns/hns_roce_device.h | 9 ++ >> drivers/infiniband/hw/hns/hns_roce_mr.c | 168 +++++++++++++++----- >> 3 files changed, 139 insertions(+), 44 deletions(-) > > I'm wonder if the ib_umem_find_best_pgsz() API should be used instead. > What is missing there? > > Thanks Actually this API is used for umem. For kmem, we add hns_roce_find_buf_best_pgsz() to do a similar job. +static int get_best_page_shift(struct hns_roce_dev *hr_dev, + struct hns_roce_mtr *mtr, + struct hns_roce_buf_attr *buf_attr) +{ + unsigned int page_sz; + + if (!buf_attr->adaptive || buf_attr->type != MTR_PBL) + return 0; + + if (mtr->umem) + page_sz = ib_umem_find_best_pgsz(mtr->umem, + hr_dev->caps.page_size_cap, + buf_attr->iova); + else + page_sz = hns_roce_find_buf_best_pgsz(hr_dev, mtr->kmem); + + if (!page_sz) + return -EINVAL; + + buf_attr->page_shift = order_base_2(page_sz); + return 0; +} Thanks, Junxian