]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
resource: Pass full extent of empty space to resource_alignf callback
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 24 Mar 2026 16:56:25 +0000 (18:56 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 27 Mar 2026 15:18:39 +0000 (10:18 -0500)
__find_resource_space() calculates the full extent of empty space but only
passes the aligned space to resource_alignf callback. In some situations,
the callback may choose take advantage of the free space before the
requested alignment.

Pass the full extent of the calculated empty space to resource_alignf
callback as an additional parameter.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Xifer <xiferdev@gmail.com>
Link: https://patch.msgid.link/20260324165633.4583-3-ilpo.jarvinen@linux.intel.com
16 files changed:
arch/alpha/kernel/pci.c
arch/arm/kernel/bios32.c
arch/m68k/kernel/pcibios.c
arch/mips/pci/pci-generic.c
arch/mips/pci/pci-legacy.c
arch/parisc/kernel/pci.c
arch/powerpc/kernel/pci-common.c
arch/s390/pci/pci.c
arch/sh/drivers/pci/pci.c
arch/x86/pci/i386.c
arch/xtensa/kernel/pci.c
drivers/pci/setup-res.c
drivers/pcmcia/rsrc_nonstatic.c
include/linux/ioport.h
include/linux/pci.h
kernel/resource.c

index 51a8a4c4572ac85bb5e7202363db7f0fc625a563..11df411b1d1821f81bac320a65d2cf43ff0a8d5c 100644 (file)
@@ -125,6 +125,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
 
 resource_size_t
 pcibios_align_resource(void *data, const struct resource *res,
+                      const struct resource *empty_res,
                       resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
index b5793e8fbdc11bdf0f9843c86eccc45441d29e78..5b9b4fcd0e54e47db4adf5939450f7bb68b9e477 100644 (file)
@@ -560,7 +560,9 @@ char * __init pcibios_setup(char *str)
  * which might be mirrored at 0x0100-0x03ff..
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-                               resource_size_t size, resource_size_t align)
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t align)
 {
        struct pci_dev *dev = data;
        resource_size_t start = res->start;
index e6ab3f9ff5d88c236270bad32e969eece00dd71e..1415f6e4e5cec6ee820fd254273077796cf27419 100644 (file)
@@ -27,7 +27,9 @@
  * which might be mirrored at 0x0100-0x03ff..
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-       resource_size_t size, resource_size_t align)
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t align)
 {
        resource_size_t start = res->start;
 
index d2d68bac3d250aa1eca9d7180a5891cf6c076aa9..f4957c26efc7e35da335ab4df08344d47f9fa0cd 100644 (file)
@@ -22,7 +22,8 @@
  * which might have be mirrored at 0x0100-0x03ff..
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-                               resource_size_t size, resource_size_t align)
+                                      const struct resource *empty_res,
+                                      resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
        resource_size_t start = res->start;
index d04b7c1294b6e67e23751a69e94f0d06c3c14a57..817e97402afe9c2094688bf4fa6afa462baf471f 100644 (file)
@@ -52,6 +52,7 @@ unsigned long pci_address_to_pio(phys_addr_t address)
  */
 resource_size_t
 pcibios_align_resource(void *data, const struct resource *res,
+                      const struct resource *empty_res,
                       resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
index cf285b17a5aee2f44bde1a4b8a96282579306130..f99b20795d5a37b4e5af53788a4e4c7ec49eb1ee 100644 (file)
@@ -196,7 +196,9 @@ void __ref pcibios_init_bridge(struct pci_dev *dev)
  * than res->start.
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-                               resource_size_t size, resource_size_t alignment)
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t alignment)
 {
        resource_size_t mask, align, start = res->start;
 
index a7a2fb60597193c8cc9e3db93c65973f929fd993..e7bfa15da04354d4613f6415aabf2023e8502beb 100644 (file)
@@ -1132,7 +1132,9 @@ static int skip_isa_ioresource_align(struct pci_dev *dev)
  * which might have be mirrored at 0x0100-0x03ff..
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-                               resource_size_t size, resource_size_t align)
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t align)
 {
        struct pci_dev *dev = data;
        resource_size_t start = res->start;
index 2a430722cbe415dd56c92fed2e513e524f46481a..39bd2adfc240fd4254c78c8b173b480be6433775 100644 (file)
@@ -266,6 +266,7 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
 }
 
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
+                                      const struct resource *empty_res,
                                       resource_size_t size,
                                       resource_size_t align)
 {
index a3903304f33faaf56ed8a12eb236a26888da47f2..7a0522316ee3b08325f4a317c95f0a31e3d927c9 100644 (file)
@@ -168,7 +168,9 @@ subsys_initcall(pcibios_init);
  * modulo 0x400.
  */
 resource_size_t pcibios_align_resource(void *data, const struct resource *res,
-                               resource_size_t size, resource_size_t align)
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t align)
 {
        struct pci_dev *dev = data;
        struct pci_channel *hose = dev->sysdata;
index c4ec39ad276b15567773a1dd392f8f006c2e2608..6fbd4b34c3f7d3b2544d4541f5c5402b86e276c9 100644 (file)
@@ -153,7 +153,8 @@ skip_isa_ioresource_align(struct pci_dev *dev) {
  */
 resource_size_t
 pcibios_align_resource(void *data, const struct resource *res,
-                       resource_size_t size, resource_size_t align)
+                      const struct resource *empty_res,
+                      resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
        resource_size_t start = res->start;
index 62c900e400d6a4ed1b576d5ac1c7836fde0a4737..64ccb7e0d92fbd0ed3c171b4ab6d2296ed44148e 100644 (file)
@@ -39,6 +39,7 @@
  */
 resource_size_t
 pcibios_align_resource(void *data, const struct resource *res,
+                      const struct resource *empty_res,
                       resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
index bb2aef373d6fc0e9da123ee016de3bb5ed434dc8..c375e255c509b14c6ada3db6bf1bf461f64476f9 100644 (file)
@@ -251,10 +251,11 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
  */
 resource_size_t __weak pcibios_align_resource(void *data,
                                              const struct resource *res,
+                                             const struct resource *empty_res,
                                              resource_size_t size,
                                              resource_size_t align)
 {
-       return res->start;
+       return res->start;
 }
 
 static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
index 0679dd434719d8e761993884d1e698cd16c59189..949e69921fe914ed12244ce8e598fc345fb5b322 100644 (file)
@@ -602,7 +602,8 @@ static resource_size_t pcmcia_common_align(struct pcmcia_align_data *align_data,
 
 static resource_size_t
 pcmcia_align(void *align_data, const struct resource *res,
-       resource_size_t size, resource_size_t align)
+            const struct resource *empty_res,
+            resource_size_t size, resource_size_t align)
 {
        struct pcmcia_align_data *data = align_data;
        struct resource_map *m;
index 19d5e04564d94c90900c4ed9f180b35e900ea5c1..3c73c9c0d4f7fe8c85658ebb1e95b33a269e476f 100644 (file)
@@ -202,6 +202,7 @@ enum {
  * typedef resource_alignf - Resource alignment callback
  * @data:      Private data used by the callback
  * @res:       Resource candidate range (an empty resource space)
+ * @empty_res: Empty resource range without alignment applied
  * @size:      The minimum size of the empty space
  * @align:     Alignment from the constraints
  *
@@ -212,6 +213,7 @@ enum {
  */
 typedef resource_size_t (*resource_alignf)(void *data,
                                           const struct resource *res,
+                                          const struct resource *empty_res,
                                           resource_size_t size,
                                           resource_size_t align);
 
index 1c270f1d512301de4d462fe7e5097c32af5c6f8d..ac332ff9da9f5df7c1a176f437ba320a181c1a32 100644 (file)
@@ -1206,9 +1206,10 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask);
 char *pcibios_setup(char *str);
 
 /* Used only when drivers/pci/setup.c is used */
-resource_size_t pcibios_align_resource(void *, const struct resource *,
-                               resource_size_t,
-                               resource_size_t);
+resource_size_t pcibios_align_resource(void *data, const struct resource *res,
+                                      const struct resource *empty_res,
+                                      resource_size_t size,
+                                      resource_size_t align);
 
 /* Generic PCI functions used internally */
 
index 1e2f1dfc0eddad571b68364d3be1a8f63e6d8572..1b8d3101bdc6ab3818ea7827f5d5474ae6628c11 100644 (file)
@@ -759,7 +759,8 @@ static int __find_resource_space(struct resource *root, struct resource *old,
                        alloc.flags = avail.flags;
                        if (alignf) {
                                alloc.start = alignf(constraint->alignf_data,
-                                                    &avail, size, constraint->align);
+                                                    &avail, &tmp,
+                                                    size, constraint->align);
                        } else {
                                alloc.start = avail.start;
                        }