| From 36798d5ae1af62e830c5e045b2e41ce038690c61 Mon Sep 17 00:00:00 2001 |
| From: Artemy Kovalyov <artemyko@mellanox.com> |
| Date: Tue, 28 Jan 2020 15:56:12 +0200 |
| Subject: RDMA/umem: Fix ib_umem_find_best_pgsz() |
| |
| From: Artemy Kovalyov <artemyko@mellanox.com> |
| |
| commit 36798d5ae1af62e830c5e045b2e41ce038690c61 upstream. |
| |
| Except for the last entry, the ending iova alignment sets the maximum |
| possible page size as the low bits of the iova must be zero when starting |
| the next chunk. |
| |
| Fixes: 4a35339958f1 ("RDMA/umem: Add API to find best driver supported page size in an MR") |
| Link: https://lore.kernel.org/r/20200128135612.174820-1-leon@kernel.org |
| Signed-off-by: Artemy Kovalyov <artemyko@mellanox.com> |
| Signed-off-by: Leon Romanovsky <leonro@mellanox.com> |
| Tested-by: Gal Pressman <galpress@amazon.com> |
| Reviewed-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/core/umem.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/infiniband/core/umem.c |
| +++ b/drivers/infiniband/core/umem.c |
| @@ -166,10 +166,13 @@ unsigned long ib_umem_find_best_pgsz(str |
| * for any address. |
| */ |
| mask |= (sg_dma_address(sg) + pgoff) ^ va; |
| - if (i && i != (umem->nmap - 1)) |
| - /* restrict by length as well for interior SGEs */ |
| - mask |= sg_dma_len(sg); |
| va += sg_dma_len(sg) - pgoff; |
| + /* Except for the last entry, the ending iova alignment sets |
| + * the maximum possible page size as the low bits of the iova |
| + * must be zero when starting the next chunk. |
| + */ |
| + if (i != (umem->nmap - 1)) |
| + mask |= va; |
| pgoff = 0; |
| } |
| best_pg_bit = rdma_find_pg_bit(mask, pgsz_bitmap); |