[PATCH v4 0/7] PCI: Resource placement algorithm fixe
From: Ilpo Järvinen
Date: Wed Oct 21 2026 - 08:55:54 EST
Hi,
v4 resolves a few sashiko findings. Also, the quirk I had in v3 is
not part of this as there are other approaches discussed in v3 thread
that seemed more preferred over the approach I had in v3.
This series generalizes resource placement algorithm. The commit
9036bd0efcb6 ("PCI: Align head space better") special cased one
composite resource remainder case to fix a regression (in a long chain
of regression fixes). Unfortunately, it introduced another regression
(or a few, to be more accurate).
Instead of building more special tricks, generalize the PCI resource
placement algorithm so it returns placements that gives better chances
for the greedy assignment algorithm to find suitable space for
subsequent assignments.
In short words, the new approach tries to find a placement for the
current resource that blocks as little of the free space range as
possible, considering both alignment and continuous free span of the
remaining free space.
In addition, the series corrects composite resource sizing to account
for gaps that have to be added due to alignment constaints and
remainder space not fully connecting (filling space all the way to
the bridge window align).
More detailed explanations in the patches themselves.
Unfortunately, this also causes yet another regression due to shuffling
resources around. I've left my quirk out of this version as it seems
the least likely approach to be used to resolve the issue. Some approach
should still be applied but that decision seems largely independent of
this series. The main part of the quirk discussion is here:
https://lore.kernel.org/linux-pci/20261013130948.6231-9-ilpo.jarvinen@xxxxxxxxxxxxxxx/
I find it likely that after this series the resources are packed tight
enough to solve also
https://bugzilla.kernel.org/show_bug.cgi?id=220016
from more than a year back but that remains to be seen (if we can still
get the reporter to test it).
I've another series coming up to improve pci=resource_alignment locking
as I realized the current approach allows parameter change to race with
the fitting and assignment algorithm.
v4:
- Drop my own quirk patch (one approach should still be picked!)
- Use 1ULL to not lose bits in 32-bit case (sashiko)
- Copy avail flags from full_avail.flags (sashiko)
- Always return "resize" from pci_specified_resource_alignment() (sashiko)
v3:
- Add roundup/down_pow_of_two64() (new patch) to avoid problems if
resource_size_t is 64-bit and unsigned long is 32-bit + use __ffs64()
(multiple potential issues mentioned by sashiko)
- Do not print res->parent in parisc debug code as the resource is never
in the resource tree (found by sashiko).
- Do not override user-alignment with the remainder moves (sashiko)
- Consider optional sizes properly when sizing bridge window gaps (sashiko)
- Move genoa quirk under arch/x86/
- Rename quirk's static resource variable
v2:
- Add patch to cleanup parisc debug print (do dyndbg conversion)
- Add patch to prevent remainder tricks when alignment override is used
(found by sashiko)
- Do not use PCIBIOS_MIN_IO/MEM but 1U as min align. The former seem
address space lower bounds even if parisc arch code misleadingly
uses them for ALIGN() call.
- Fix res->end + 1 overflow case (found by sashiko)
- Tweak debug print formatting
- Reworked the iomem black hole quirk (now based on the bridge)
Ilpo Järvinen (7):
resource: Mark free space assigned
PCI/parisc: Clean up resource debug print & use dynamic debug
PCI: Honor alignment overrides
PCI: Fix nesting windows with remainder at the left edge
linux/log2.h: Add 64-bit roundup/down_pow_of_two64() variants
PCI: Place resources to either edge of the window
PCI: Fix composite resource sizing
arch/alpha/kernel/pci.c | 3 +-
arch/arm/kernel/bios32.c | 5 +-
arch/m68k/kernel/pcibios.c | 4 +-
arch/mips/pci/pci-generic.c | 5 +-
arch/mips/pci/pci-legacy.c | 5 +-
arch/parisc/kernel/pci.c | 20 +--
arch/powerpc/kernel/pci-common.c | 5 +-
arch/sh/drivers/pci/pci.c | 5 +-
arch/x86/pci/i386.c | 5 +-
arch/xtensa/kernel/pci.c | 5 +-
drivers/char/agp/intel-gtt.c | 5 +-
drivers/gpu/drm/i915/i915_gmch.c | 5 +-
drivers/pci/pci.c | 7 +-
drivers/pci/pci.h | 4 +
drivers/pci/setup-bus.c | 88 +++++++++++-
drivers/pci/setup-res.c | 223 +++++++++++++++++++++++++++----
include/linux/log2.h | 52 +++++++
include/linux/pci.h | 33 ++++-
kernel/resource.c | 3 +-
19 files changed, 412 insertions(+), 70 deletions(-)
base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
--
2.47.3