diff options
author | Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> | 2024-05-07 13:25:20 +0300 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2024-05-28 11:14:14 -0500 |
commit | 094c0ce5451dd6232938e307d6f259e76571a778 (patch) | |
tree | 106d84619569b4c617d37147e361ec1fdc8d53da /kernel/resource.c | |
parent | 4eed3dd7116814c82630b0f1b0f73fa96707134f (diff) | |
download | linux-094c0ce5451dd6232938e307d6f259e76571a778.tar.gz linux-094c0ce5451dd6232938e307d6f259e76571a778.tar.bz2 linux-094c0ce5451dd6232938e307d6f259e76571a778.zip |
resource: Handle simple alignment inside __find_resource_space()
allocate_resource() accepts ->alignf() callback to perform custom alignment
beyond constraint->align. If alignf is NULL, simple_align_resource() is
used which only returns avail->start (no change).
Using avail->start directly is natural and can be done with a conditional
in __find_resource_space() instead which avoids unnecessarily using
callback. It makes the code inside __find_resource_space() more obvious and
removes the need for the caller to provide constraint->alignf
unnecessarily.
This is preparation for exporting find_resource_space().
Link: https://lore.kernel.org/r/20240507102523.57320-6-ilpo.jarvinen@linux.intel.com
Tested-by: Lidong Wang <lidong.wang@intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Diffstat (limited to 'kernel/resource.c')
-rw-r--r-- | kernel/resource.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 26ad6f223652..35c44c23b037 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -621,14 +621,6 @@ void __weak arch_remove_reservations(struct resource *avail) { } -static resource_size_t simple_align_resource(void *data, - const struct resource *avail, - resource_size_t size, - resource_size_t align) -{ - return avail->start; -} - static void resource_clip(struct resource *res, resource_size_t min, resource_size_t max) { @@ -648,6 +640,7 @@ static int __find_resource_space(struct resource *root, struct resource *old, { struct resource *this = root->child; struct resource tmp = *new, avail, alloc; + resource_alignf alignf = constraint->alignf; tmp.start = root->start; /* @@ -676,8 +669,12 @@ static int __find_resource_space(struct resource *root, struct resource *old, avail.flags = new->flags & ~IORESOURCE_UNSET; if (avail.start >= tmp.start) { alloc.flags = avail.flags; - alloc.start = constraint->alignf(constraint->alignf_data, &avail, - size, constraint->align); + if (alignf) { + alloc.start = alignf(constraint->alignf_data, + &avail, size, constraint->align); + } else { + alloc.start = avail.start; + } alloc.end = alloc.start + size - 1; if (alloc.start <= alloc.end && resource_contains(&avail, &alloc)) { @@ -788,9 +785,6 @@ int allocate_resource(struct resource *root, struct resource *new, int err; struct resource_constraint constraint; - if (!alignf) - alignf = simple_align_resource; - constraint.min = min; constraint.max = max; constraint.align = align; |