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]

 



On Wed, Feb 13, 2019 at 10:36 PM Saleem, Shiraz <shiraz.saleem@xxxxxxxxx> wrote:
>
> >Subject: Re: [rdma-next 01/12] RDMA/bnxt_re: Use for_each_sg_dma_page
> >iterator on umem SGL
> >
> >On Wed, Feb 13, 2019 at 01:12:37PM +0200, Gal Pressman wrote:
> >> On 11-Feb-19 17:24, Shiraz Saleem wrote:
> >> > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c
> >> > b/drivers/infiniband/hw/bnxt_re/qplib_res.c
> >> > index c8502c2..c8478c1 100644
> >> > +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
> >> > @@ -85,7 +85,7 @@ static void __free_pbl(struct pci_dev *pdev,
> >> > struct bnxt_qplib_pbl *pbl,  static int __alloc_pbl(struct pci_dev *pdev, struct
> >bnxt_qplib_pbl *pbl,
> >> >                   struct scatterlist *sghead, u32 pages, u32 pg_size)  {
> >> > -  struct scatterlist *sg;
> >> > +  struct sg_dma_page_iter sg_iter;
> >> >    bool is_umem = false;
> >> >    int i;
> >> >
> >> > @@ -116,12 +116,13 @@ static int __alloc_pbl(struct pci_dev *pdev, struct
> >bnxt_qplib_pbl *pbl,
> >> >    } else {
> >> >            i = 0;
> >> >            is_umem = true;
> >> > -          for_each_sg(sghead, sg, pages, i) {
> >> > -                  pbl->pg_map_arr[i] = sg_dma_address(sg);
> >> > -                  pbl->pg_arr[i] = sg_virt(sg);
> >> > +          for_each_sg_dma_page(sghead, &sg_iter, pages, 0) {
> >> > +                  pbl->pg_map_arr[i] =
> >sg_page_iter_dma_address(&sg_iter);
> >> > +                  pbl->pg_arr[i] = NULL;
> >>                      if (!pbl->pg_arr[i])
> >>
> >> Surely something went wrong here?
> >
> >That if does look wrong.
> >
> >I recall Shiraz removed the pg_arr as it wasn't being used, so maybe the if should
> >go to?
>
> Thanks Gal for catching this. Yes the reason pg_arr is set to NULL here is because it
> appears used only in !umem case. But then the following if check is a bug. Duh!
>
> bnxt_re folks - is this acceptable?
>
> --- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
> +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
> @@ -85,7 +85,7 @@ static void __free_pbl(struct pci_dev *pdev, struct bnxt_qplib_pbl *pbl,
>  static int __alloc_pbl(struct pci_dev *pdev, struct bnxt_qplib_pbl *pbl,
>                        struct scatterlist *sghead, u32 pages, u32 pg_size)
>  {
> -       struct scatterlist *sg;
> +       struct sg_dma_page_iter sg_iter;
>         bool is_umem = false;
>         int i;
>
> @@ -116,12 +116,9 @@ static int __alloc_pbl(struct pci_dev *pdev, struct bnxt_qplib_pbl *pbl,
>         } else {
>                 i = 0;
>                 is_umem = true;
> -               for_each_sg(sghead, sg, pages, i) {
> -                       pbl->pg_map_arr[i] = sg_dma_address(sg);
> -                       pbl->pg_arr[i] = sg_virt(sg);
> -                       if (!pbl->pg_arr[i])
> -                               goto fail;
> -
> +               for_each_sg_dma_page(sghead, &sg_iter, pages, 0) {
> +                       pbl->pg_map_arr[i] = sg_page_iter_dma_address(&sg_iter);
> +                       i++;
>                         pbl->pg_count++;
The thing is we need the virtual address for future reference in this
path. If we do not have virt-addr populated it breaks!
>                 }
>         }
>
> 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