Commit 659aa050 authored by Alison Schofield's avatar Alison Schofield Committed by Dan Williams

kernel/resource: Increment by align value in get_free_mem_region()

Currently get_free_mem_region() searches for available capacity
in increments equal to the region size being requested. This can
cause the search to take giant steps through the resource leaving
needless gaps and missing available space.

Specifically 'cxl create-region' fails with ERANGE even though capacity
of the given size and CXL's expected 256M x InterleaveWays alignment can
be satisfied.

Replace the total-request-size increment with a next alignment increment
so that the next possible address is always examined for availability.

Fixes: 14b80582 ("resource: Introduce alloc_free_mem_region()")
Reported-by: default avatarDmytro Adamenko <dmytro.adamenko@intel.com>
Reported-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarAlison Schofield <alison.schofield@intel.com>
Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20231113221324.1118092-1-alison.schofield@intel.com
Cc: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent e05501e8
...@@ -1844,8 +1844,8 @@ get_free_mem_region(struct device *dev, struct resource *base, ...@@ -1844,8 +1844,8 @@ get_free_mem_region(struct device *dev, struct resource *base,
write_lock(&resource_lock); write_lock(&resource_lock);
for (addr = gfr_start(base, size, align, flags); for (addr = gfr_start(base, size, align, flags);
gfr_continue(base, addr, size, flags); gfr_continue(base, addr, align, flags);
addr = gfr_next(addr, size, flags)) { addr = gfr_next(addr, align, flags)) {
if (__region_intersects(base, addr, size, 0, IORES_DESC_NONE) != if (__region_intersects(base, addr, size, 0, IORES_DESC_NONE) !=
REGION_DISJOINT) REGION_DISJOINT)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment