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 Leon, we should be sure to check this on mlx5 also Thanks, Jason