Skip to content
  • Bjorn Helgaas's avatar
    PCI: fix pci_bus_alloc_resource() hang, prefer positive decode · 82e3e767
    Bjorn Helgaas authored
    When a PCI bus has two resources with the same start/end, e.g.,
    
        pci_bus 0000:04: resource 2 [mem 0xd0000000-0xd7ffffff pref]
        pci_bus 0000:04: resource 7 [mem 0xd0000000-0xd7ffffff]
    
    the previous pci_bus_find_resource_prev() implementation would alternate
    between them forever:
    
        pci_bus_find_resource_prev(... [mem 0xd0000000-0xd7ffffff pref])
            returns [mem 0xd0000000-0xd7ffffff]
        pci_bus_find_resource_prev(... [mem 0xd0000000-0xd7ffffff])
            returns [mem 0xd0000000-0xd7ffffff pref]
        pci_bus_find_resource_prev(... [mem 0xd0000000-0xd7ffffff pref])
            returns [mem 0xd0000000-0xd7ffffff]
        ...
    
    This happened because there was no ordering between two resources with the
    same start and end.  A resource that had the same start and end as the
    cursor, but was not itself the cursor, was considered to be before the
    cursor.
    
    This patch fixes the hang by making a fixed ordering between any two
    resources.
    
    In addition, it tries to allocate from positively decoded regions before
    using any subtractively decoded resources.  This means we will use a
    positive decode region before a subtractive decode one, even if it means
    using a smaller address.
    
    Reference: https://bugzilla.kernel.org/show_bug.cgi?id=22062
    
    
    Reported-by: default avatarBorislav Petkov <bp@amd64.org>
    Tested-by: default avatarBorislav Petkov <bp@amd64.org>
    Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    82e3e767