• Linus Torvalds's avatar
    Fix build errors due to new UIO_MEM_DMA_COHERENT mess · 498e47cd
    Linus Torvalds authored
    Commit 576882ef ("uio: introduce UIO_MEM_DMA_COHERENT type")
    introduced a new use-case for 'struct uio_mem' where the 'mem' field now
    contains a kernel virtual address when 'memtype' is set to
    UIO_MEM_DMA_COHERENT.
    
    That in turn causes build errors, because 'mem' is of type
    'phys_addr_t', and a virtual address is a pointer type.  When the code
    just blindly uses cast to mix the two, it caused problems when
    phys_addr_t isn't the same size as a pointer - notably on 32-bit
    architectures with PHYS_ADDR_T_64BIT.
    
    The proper thing to do would probably be to use a union member, and not
    have any casts, and make the 'mem' member be a union of 'mem.physaddr'
    and 'mem.vaddr', based on 'memtype'.
    
    This is not that proper thing.  This is just fixing the ugly casts to be
    even uglier, but at least not cause build errors on 32-bit platforms
    with 64-bit physical addresses.
    Reported-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Fixes: 576882ef ("uio: introduce UIO_MEM_DMA_COHERENT type")
    Fixes: 7722151e ("uio_pruss: UIO_MEM_DMA_COHERENT conversion")
    Fixes: 01994780 ("uio_dmem_genirq: UIO_MEM_DMA_COHERENT conversion")
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Chris Leech <cleech@redhat.com>
    Cc: Nilesh Javali <njavali@marvell.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linuxfoundation.org>
    498e47cd
uio.c 23.9 KB