• Jeremy Linton's avatar
    usb: usbfs: correct kernel->user page attribute mismatch · 2bef9aed
    Jeremy Linton authored
    On some architectures (e.g. arm64) requests for
    IO coherent memory may use non-cachable attributes if
    the relevant device isn't cache coherent. If these
    pages are then remapped into userspace as cacheable,
    they may not be coherent with the non-cacheable mappings.
    
    In particular this happens with libusb, when it attempts
    to create zero-copy buffers for use by rtl-sdr
    (https://github.com/osmocom/rtl-sdr/). On low end arm
    devices with non-coherent USB ports, the application will
    be unexpectedly killed, while continuing to work fine on
    arm machines with coherent USB controllers.
    
    This bug has been discovered/reported a few times over
    the last few years. In the case of rtl-sdr a compile time
    option to enable/disable zero copy was implemented to
    work around it.
    
    Rather than relaying on application specific workarounds,
    dma_mmap_coherent() can be used instead of remap_pfn_range().
    The page cache/etc attributes will then be correctly set in
    userspace to match the kernel mapping.
    Signed-off-by: default avatarJeremy Linton <jeremy.linton@arm.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20200504201348.1183246-1-jeremy.linton@arm.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2bef9aed
devio.c 68.1 KB