• Y
    PCI/ASPM: Use dev->has_secondary_link to find downstream links · c8fc9339
    Yijing Wang 提交于
    We allocate pcie_link_state for the component at the upstream end of a
    Link.  Previously we did this by allocating pcie_link_state for Root Ports
    and Downstream Ports.  This works fine for the typical topology:
    
      00:1c.0 Root Port       [bridge to bus 02]
      02:00.0 Upstream Port   [bridge to bus 03]
      03:00.0 Downstream Port [bridge to bus 04]
      04:00.0 Endpoint or Switch Port
    
    However, it is possible to have a Root Port connected to a Downstream Port
    instead of an Upstream Port, as in Robert White's ATCA system:
    
      00:1c.0 Root Port       [bridge to bus 02]
      02:00.0 Downstream Port [bridge to bus 03]
      03:01.0 Downstream Port [bridge to bus 04]
      04:00.0 Endpoint or Switch Port
    
    In this topology, we wrongly allocated pcie_link_state for the 02:00.0
    Downstream Port, which is actually the *downstream* end of a link.  This
    led to the following NULL pointer dereference when we tried to connect this
    link into the tree of links starting at the 00:1c.0 Root Port:
    
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
      IP: [<ffffffff81550324>] pcie_aspm_init_link_state+0x744/0x850
      Hardware name: Kontron B3001/B3001, BIOS 4.6.3 08/07/2012
      Call Trace:
       [<ffffffff8153b865>] pci_scan_slot+0xd5/0x120
       [<ffffffff8153ca1d>] pci_scan_child_bus+0x2d/0xd0
       ...
    
    Instead of relying on the component type to identify the upstream end of a
    link, use the "dev->has_secondary_link" field.
    
    This means it's now possible for an Upstream Port to have a link on its
    secondary side, so alloc_pcie_link_state() needs to connect links
    originating from both Upstream and Downstream Ports into the tree.
    
    [bhelgaas: changelog, add comment]
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=94361
    Link: http://lkml.kernel.org/r/54EB81B2.4050904@pobox.comReported-by: NRobert White <rwhite@pobox.com>
    Signed-off-by: NYijing Wang <wangyijing@huawei.com>
    Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
    c8fc9339
aspm.c 26.4 KB