On 8/8/24 15:28, Bjorn Helgaas wrote: > On Wed, Aug 07, 2024 at 11:17:12AM -0400, Stewart Hildebrand wrote: >> Devices with alignment specified will lose their alignment in cases when >> the bridge resources have been released, e.g. due to insufficient bridge >> window size. Restore the alignment. > > I guess this fixes a problem when the user has specified > "pci=resource_alignment=..." and we've decided to release and > reallocate a bridge window? Just looking for a bit more concrete > description of what this problem would look like to a user. Yes. When alignment has been specified via pcibios_default_alignment() or by the user with "pci=resource_alignment=...", and the bridge window is being reallocated, the specified alignment is lost and the resource may not be sufficiently aligned after reallocation. I can expand the commit description. > >> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> >> --- >> v2->v3: >> * no change >> >> v1->v2: >> * capitalize subject text >> --- >> drivers/pci/setup-bus.c | 19 +++++++++++++++++++ >> 1 file changed, 19 insertions(+) >> >> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c >> index 23082bc0ca37..ab7510ce6917 100644 >> --- a/drivers/pci/setup-bus.c >> +++ b/drivers/pci/setup-bus.c >> @@ -1594,6 +1594,23 @@ static void __pci_bridge_assign_resources(const struct pci_dev *bridge, >> } >> } >> >> +static void restore_child_resource_alignment(struct pci_bus *bus) >> +{ >> + struct pci_dev *dev; >> + >> + list_for_each_entry(dev, &bus->devices, bus_list) { >> + struct pci_bus *b; >> + >> + pci_reassigndev_resource_alignment(dev); >> + >> + b = dev->subordinate; >> + if (!b) >> + continue; >> + >> + restore_child_resource_alignment(b); >> + } >> +} >> + >> #define PCI_RES_TYPE_MASK \ >> (IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH |\ >> IORESOURCE_MEM_64) >> @@ -1648,6 +1665,8 @@ static void pci_bridge_release_resources(struct pci_bus *bus, >> r->start = 0; >> r->flags = 0; >> >> + restore_child_resource_alignment(bus); >> + >> /* Avoiding touch the one without PREF */ >> if (type & IORESOURCE_PREFETCH) >> type = IORESOURCE_PREFETCH; >> -- >> 2.46.0 >>