• Linus Walleij's avatar
    RDMA/siw: Pass a pointer to virt_to_page() · 0d1b756a
    Linus Walleij authored
    Functions that work on a pointer to virtual memory such as
    virt_to_pfn() and users of that function such as
    virt_to_page() are supposed to pass a pointer to virtual
    memory, ideally a (void *) or other pointer. However since
    many architectures implement virt_to_pfn() as a macro,
    this function becomes polymorphic and accepts both a
    (unsigned long) and a (void *).
    
    If we instead implement a proper virt_to_pfn(void *addr)
    function the following happens (occurred on arch/arm):
    
    drivers/infiniband/sw/siw/siw_qp_tx.c:32:23: warning: incompatible
      integer to pointer conversion passing 'dma_addr_t' (aka 'unsigned int')
      to parameter of type 'const void *' [-Wint-conversion]
    drivers/infiniband/sw/siw/siw_qp_tx.c:32:37: warning: passing argument
      1 of 'virt_to_pfn' makes pointer from integer without a cast
      [-Wint-conversion]
    drivers/infiniband/sw/siw/siw_qp_tx.c:538:36: warning: incompatible
      integer to pointer conversion passing 'unsigned long long'
      to parameter of type 'const void *' [-Wint-conversion]
    
    Fix this with an explicit cast. In one case where the SIW
    SGE uses an unaligned u64 we need a double cast modifying the
    virtual address (va) to a platform-specific uintptr_t before
    casting to a (void *).
    
    Fixes: b9be6f18 ("rdma/siw: transmit path")
    Cc: linux-rdma@vger.kernel.org
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20220902215918.603761-1-linus.walleij@linaro.orgSigned-off-by: default avatarLeon Romanovsky <leon@kernel.org>
    0d1b756a
siw_qp_tx.c 31.1 KB