RE: [rdma-next 01/12] RDMA/bnxt_re: Use for_each_sg_dma_page iterator on umem SGL

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

 



>Subject: Re: [rdma-next 01/12] RDMA/bnxt_re: Use for_each_sg_dma_page
>iterator on umem SGL
>
>On Mon, Feb 11, 2019 at 8:56 PM Shiraz Saleem <shiraz.saleem@xxxxxxxxx>
>wrote:
>>
>> From: "Shiraz, Saleem" <shiraz.saleem@xxxxxxxxx>
>>
>> Use the for_each_sg_dma_page iterator variant to walk the umem
>> DMA-mapped SGL and get the page DMA address. This avoids the extra
>> loop to iterate pages in the SGE when for_each_sg iterator is used.
>>
>> Additionally, purge umem->page_shift usage in the driver as its only
>> relevant for ODP MRs. Use system page size and shift instead.
>>
>> Cc: Selvin Xavier <selvin.xavier@xxxxxxxxxxxx>
>> Cc: Devesh Sharma <devesh.sharma@xxxxxxxxxxxx>
>> Signed-off-by: Shiraz, Saleem <shiraz.saleem@xxxxxxxxx>
>> ---
>>  drivers/infiniband/hw/bnxt_re/ib_verbs.c  | 23
>> +++++++++--------------  drivers/infiniband/hw/bnxt_re/qplib_res.c |
>> 9 +++++----
>>  2 files changed, 14 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
>> b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
>> index 1d7469e..ed7cb0b 100644
>> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
>> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
>> @@ -3566,19 +3566,14 @@ static int fill_umem_pbl_tbl(struct ib_umem
>*umem, u64 *pbl_tbl_orig,
>>         u64 *pbl_tbl = pbl_tbl_orig;
>>         u64 paddr;
>>         u64 page_mask = (1ULL << page_shift) - 1;
>> -       int i, pages;
>> -       struct scatterlist *sg;
>> -       int entry;
>> -
>> -       for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
>> -               pages = sg_dma_len(sg) >> PAGE_SHIFT;
>> -               for (i = 0; i < pages; i++) {
>> -                       paddr = sg_dma_address(sg) + (i << PAGE_SHIFT);
>> -                       if (pbl_tbl == pbl_tbl_orig)
>> -                               *pbl_tbl++ = paddr & ~page_mask;
>> -                       else if ((paddr & page_mask) == 0)
>> -                               *pbl_tbl++ = paddr;
>> -               }
>> +       struct sg_dma_page_iter sg_iter;
>> +
>> +       for_each_sg_dma_page(umem->sg_head.sgl, &sg_iter, umem->nmap, 0)
>{
>> +               paddr = sg_page_iter_dma_address(&sg_iter);
>> +               if (pbl_tbl == pbl_tbl_orig)
>> +                       *pbl_tbl++ = paddr & ~page_mask;
>> +               else if ((paddr & page_mask) == 0)
>> +                       *pbl_tbl++ = paddr;
>>         }
>>         return pbl_tbl - pbl_tbl_orig;  } @@ -3641,7 +3636,7 @@ struct
>> ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
>>                 goto free_umem;
>>         }
>>
>> -       page_shift = umem->page_shift;
>> +       page_shift = PAGE_SHIFT;
>I fear this will break Hugepage support also!
>>

How? umem->page_shift is always the system page shift for non-ODP MRs.
This driver is keying off the umem->hugetlb flag for determining if MR is backed
by huge pages right?

FYI - I will be submitting a follow on series to remove that flag
from core and instead bnxt_re and i40iw will use the core helpers to get the
huge page aligned address. It would be good to test drive that series.

Shiraz





[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