]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/umem: Fix ib_umem_find_best_pgsz()
authorArtemy Kovalyov <artemyko@mellanox.com>
Tue, 28 Jan 2020 13:56:12 +0000 (15:56 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 28 Jan 2020 18:10:54 +0000 (14:10 -0400)
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>
drivers/infiniband/core/umem.c

index 146f98fbf22b053f56530c83df04d8b77d890f09..ac4738d2e0dd74f0298a00b20a0fcb14ec2c0649 100644 (file)
@@ -166,10 +166,13 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
                 * 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);