]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/umem: Make ib_umem_is_contiguous() safe on 32 bit
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 1 Jun 2026 16:52:33 +0000 (13:52 -0300)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 5 Jun 2026 15:36:33 +0000 (12:36 -0300)
Sashiko points out the roundup_pow_of_two() only uses unsigned long but
dma_addr_t can be u64.

Change this algorithm to be simpler, compute the page size, if any page
size is found and it results in a single block then it is contiguous.

Link: https://patch.msgid.link/r/3-v1-88303e9e509f+f7-ib_umem_types_jgg@nvidia.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
include/rdma/ib_umem.h

index 4c8f433ba246f3ac07718c29513c85aa074ebd1c..bb4005a9c6906651ddbf3d5c1b7f159ba1b985d1 100644 (file)
@@ -145,16 +145,11 @@ static inline unsigned long ib_umem_find_best_pgoff(struct ib_umem *umem,
 
 static inline bool ib_umem_is_contiguous(struct ib_umem *umem)
 {
-       dma_addr_t dma_addr;
        unsigned long pgsz;
 
-       /*
-        * Select the smallest aligned page that can contain the whole umem if
-        * it was contiguous.
-        */
-       dma_addr = ib_umem_start_dma_addr(umem);
-       pgsz = roundup_pow_of_two((dma_addr ^ (umem->length - 1 + dma_addr)) + 1);
-       return !!ib_umem_find_best_pgoff(umem, pgsz, U64_MAX);
+       pgsz = ib_umem_find_best_pgsz(umem, ULONG_MAX,
+                                     ib_umem_start_dma_addr(umem));
+       return pgsz && ib_umem_num_dma_blocks(umem, pgsz) == 1;
 }
 
 struct ib_umem_dmabuf *ib_umem_dmabuf_get(struct ib_device *device,