> Subject: Re: [PATCH for-rc 1/3] RDMA/core: Fix umem iterator when PAGE_SIZE > is greater then HCA pgsz > > On Wed, Nov 15, 2023 at 01:17:50PM -0600, Shiraz Saleem wrote: > > diff --git a/drivers/infiniband/core/umem.c > > b/drivers/infiniband/core/umem.c index f9ab671c8eda..07c571c7b699 > > 100644 > > --- a/drivers/infiniband/core/umem.c > > +++ b/drivers/infiniband/core/umem.c > > @@ -96,12 +96,6 @@ unsigned long ib_umem_find_best_pgsz(struct > ib_umem *umem, > > return page_size; > > } > > > > - /* rdma_for_each_block() has a bug if the page size is smaller than the > > - * page size used to build the umem. For now prevent smaller page sizes > > - * from being returned. > > - */ > > - pgsz_bitmap &= GENMASK(BITS_PER_LONG - 1, PAGE_SHIFT); > > - > > /* The best result is the smallest page size that results in the minimum > > * number of required pages. Compute the largest page size that could > > * work based on VA address bits that don't change. > > diff --git a/include/rdma/ib_umem.h b/include/rdma/ib_umem.h index > > 95896472a82b..e775d1b4910c 100644 > > --- a/include/rdma/ib_umem.h > > +++ b/include/rdma/ib_umem.h > > @@ -77,6 +77,8 @@ static inline void > > __rdma_umem_block_iter_start(struct ib_block_iter *biter, { > > __rdma_block_iter_start(biter, umem->sgt_append.sgt.sgl, > > umem->sgt_append.sgt.nents, pgsz); > > + biter->__sg_advance = ib_umem_offset(umem) & ~(pgsz - 1); > > + biter->__sg_numblocks = ib_umem_num_dma_blocks(umem, pgsz); > > } > > > > /** > > @@ -92,7 +94,7 @@ static inline void __rdma_umem_block_iter_start(struct > ib_block_iter *biter, > > */ > > #define rdma_umem_for_each_dma_block(umem, biter, pgsz) \ > > for (__rdma_umem_block_iter_start(biter, umem, pgsz); \ > > - __rdma_block_iter_next(biter);) > > + __rdma_block_iter_next(biter) && (biter)->__sg_numblocks--;) > > This sg_numblocks should be in the __rdma_block_iter_next() ? > > It makes sense to me > The __rdma_block_iter_next() is common to two iterators: rdma_umem_for_each_dma_block() and rdma_for_each_block. The patch makes adjustments to protect users of rdma_for_each_block(). We are working on a v2 to add a umem specific next function that will implement the downcount.