• Ilpo Järvinen's avatar
    PCI: Fix resource double counting on remove & rescan · 903534fa
    Ilpo Järvinen authored
    pbus_size_mem() keeps the size of the optional resources in
    children_add_size. When calculating the PCI bridge window size,
    calculate_memsize() lower bounds size by old_size before adding
    children_add_size and performing the window size alignment. This
    results in double counting for the resources in children_add_size
    because old_size may be based on the previous size of the bridge
    window after it has already included children_add_size (that is,
    size1 in pbus_size_mem() from an earlier invocation of that
    function).
    
    As a result, on repeated remove of the bus & rescan cycles the resource
    size keeps increasing when children_add_size is non-zero as can be seen
    from this extract:
    
      iomem0:  23fffd00000-23fffdfffff : PCI Bus 0000:03    # 1MiB
      iomem1:  20000000000-200001fffff : PCI Bus 0000:03    # 2MiB
      iomem2:  20000000000-200002fffff : PCI Bus 0000:03    # 3MiB
      iomem3:  20000000000-200003fffff : PCI Bus 0000:03    # 4MiB
      iomem4:  20000000000-200004fffff : PCI Bus 0000:03    # 5MiB
    
    Solve the double counting by moving old_size check later in
    calculate_memsize() so that children_add_size is already accounted for.
    
    After the patch, the bridge window retains its size as expected:
    
      iomem0:  23fffd00000-23fffdfffff : PCI Bus 0000:03    # 1MiB
      iomem1:  20000000000-200000fffff : PCI Bus 0000:03    # 1MiB
      iomem2:  20000000000-200000fffff : PCI Bus 0000:03    # 1MiB
    
    Fixes: a4ac9fea ("PCI : Calculate right add_size")
    Link: https://lore.kernel.org/r/20240507102523.57320-2-ilpo.jarvinen@linux.intel.comTested-by: default avatarLidong Wang <lidong.wang@intel.com>
    Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    903534fa
setup-bus.c 62.1 KB