Like the other calls in this function virt_to_page() expects a pointer, not an integer. However since many architectures implement virt_to_pfn() as a macro, this function becomes polymorphic and accepts both a (unsigned long) and a (void *). Fix this up with an explicit cast. Then we need a second cast to (uintptr_t). This is because the kernel robot builds this driver also for the PARISC, yielding the following build error on PARISC when casting (void *) to virt_to_page(): drivers/infiniband/sw/rxe/rxe_mr.c: In function 'rxe_set_page': >> drivers/infiniband/sw/rxe/rxe_mr.c:216:42: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 216 | struct page *page = virt_to_page((void *)(iova & mr->page_mask)); | ^ include/asm-generic/memory_model.h:18:46: note: in definition of macro '__pfn_to_page' 18 | #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) | ^~~ arch/parisc/include/asm/page.h:179:45: note: in expansion of macro '__pa' 179 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | ^~~~ drivers/infiniband/sw/rxe/rxe_mr.c:216:29: note: in expansion of macro 'virt_to_page' 216 | struct page *page = virt_to_page((void *)(iova & mr->page_mask)); | ^~~~~~~~~~~~ First: I think this happens because iova is u64 by design and (void *) on PARISC is sometimes 32 bit. Second: compilation of the SW RXE driver on PARISC is made possible because it fulfills depends on INFINIBAND_VIRT_DMA since that is just def_bool !HIGHMEM and PARISC does not have HIGHMEM. By first casting iova to (uintptr_t) it is turned into a u32 on PARISC or any other 32bit system and u64 on any 64BIT system. Link: https://lore.kernel.org/linux-rdma/202303242000.HmTaa6yB-lkp@xxxxxxxxx/ Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> --- ChangeLog v1->v2: - Fix up confusion between virtual and physical addresses found by Jason in a separate patch. - Fix up compilation on PARISC by additional cast. I don't know if this is the right solution, perhaps RDMA should rather depend on 64BIT if the subsystem is only for 64BIT systems? --- drivers/infiniband/sw/rxe/rxe_mr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c index 8e8250652f9d..a5efb0575956 100644 --- a/drivers/infiniband/sw/rxe/rxe_mr.c +++ b/drivers/infiniband/sw/rxe/rxe_mr.c @@ -213,7 +213,7 @@ int rxe_mr_init_fast(int max_pages, struct rxe_mr *mr) static int rxe_set_page(struct ib_mr *ibmr, u64 iova) { struct rxe_mr *mr = to_rmr(ibmr); - struct page *page = virt_to_page(iova & mr->page_mask); + struct page *page = virt_to_page((void *)(uintptr_t)(iova & mr->page_mask)); bool persistent = !!(mr->access & IB_ACCESS_FLUSH_PERSISTENT); int err; -- 2.34.1