• Martin Wilck's avatar
    PCI: fix size checks for mmap() on /proc/bus/pci files · 3b519e4e
    Martin Wilck authored
    The checks for valid mmaps of PCI resources made through /proc/bus/pci files
    that were introduced in 9eff02e2 have several
    problems:
    
    1. mmap() calls on /proc/bus/pci files are made with real file offsets > 0,
    whereas under /sys/bus/pci/devices, the start of the resource corresponds
    to offset 0. This may lead to false negatives in pci_mmap_fits(), which
    implicitly assumes the /sys/bus/pci/devices layout.
    
    2. The loop in proc_bus_pci_mmap doesn't skip empty resouces. This leads
    to false positives, because pci_mmap_fits() doesn't treat empty resources
    correctly (the calculated size is 1 << (8*sizeof(resource_size_t)-PAGE_SHIFT)
    in this case!).
    
    3. If a user maps resources with BAR > 0, pci_mmap_fits will emit bogus
    WARNINGS for the first resources that don't fit until the correct one is found.
    
    On many controllers the first 2-4 BARs are used, and the others are empty.
    In this case, an mmap attempt will first fail on the non-empty BARs
    (including the "right" BAR because of 1.) and emit bogus WARNINGS because
    of 3., and finally succeed on the first empty BAR because of 2.
    This is certainly not the intended behaviour.
    
    This patch addresses all 3 issues.
    Updated with an enum type for the additional parameter for pci_mmap_fits().
    
    Cc: stable@kernel.org
    Signed-off-by: default avatarMartin Wilck <martin.wilck@ts.fujitsu.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    3b519e4e
pci.h 11.2 KB