diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:25:34 -0700 |
---|---|---|
committer | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:25:34 -0700 |
commit | d5266a6df5ef874c81be39e694627755e5769fde (patch) | |
tree | 738cb49bda1cbf0af7e8c0249b1d783c5de0820b | |
parent | 4ffe83708c1722e75670410514da8b20a0c23b1f (diff) | |
download | linux-yinghai-d5266a6df5ef874c81be39e694627755e5769fde.tar.gz |
resource: Add allocate_resource_fit()
Use updated find_resource to return matched resource instead using head
of bigger range.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
-rw-r--r-- | include/linux/ioport.h | 8 | ||||
-rw-r--r-- | kernel/resource.c | 27 |
2 files changed, 27 insertions, 8 deletions
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 9ab44ab9669d5..7eb3224291de8 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -148,6 +148,14 @@ extern struct resource *insert_resource_conflict(struct resource *parent, struct extern int insert_resource(struct resource *parent, struct resource *new); extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new); extern void arch_remove_reservations(struct resource *avail); +int allocate_resource_fit(struct resource *root, struct resource *new, + resource_size_t size, resource_size_t min, + resource_size_t max, resource_size_t align, + resource_size_t (*alignf)(void *, + const struct resource *, + resource_size_t, + resource_size_t), + void *alignf_data, bool fit); extern int allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, diff --git a/kernel/resource.c b/kernel/resource.c index 3572de690724e..ef467ed80e251 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -591,7 +591,7 @@ static int __allocate_resource(struct resource *root, struct resource *new, const struct resource *, resource_size_t, resource_size_t), - void *alignf_data) + void *alignf_data, bool fit) { int err; struct resource_constraint constraint; @@ -604,7 +604,7 @@ static int __allocate_resource(struct resource *root, struct resource *new, constraint.align = align; constraint.alignf = alignf; constraint.alignf_data = alignf_data; - constraint.fit = false; + constraint.fit = fit; if (new->parent) { /* resource is already allocated, try reallocating with @@ -618,25 +618,36 @@ static int __allocate_resource(struct resource *root, struct resource *new, return err; } -int allocate_resource(struct resource *root, struct resource *new, +int allocate_resource_fit(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t), - void *alignf_data) + void *alignf_data, bool fit) { int ret; write_lock(&resource_lock); ret = __allocate_resource(root, new, size, min, max, align, - alignf, alignf_data); + alignf, alignf_data, fit); write_unlock(&resource_lock); return ret; } - +int allocate_resource(struct resource *root, struct resource *new, + resource_size_t size, resource_size_t min, + resource_size_t max, resource_size_t align, + resource_size_t (*alignf)(void *, + const struct resource *, + resource_size_t, + resource_size_t), + void *alignf_data) +{ + return allocate_resource_fit(root, new, size, min, max, + align, alignf, alignf_data, false); +} EXPORT_SYMBOL(allocate_resource); /** @@ -1171,7 +1182,7 @@ int probe_resource(struct resource *b_res, memset(busn_res, 0, sizeof(struct resource)); ret = __allocate_resource(b_res, busn_res, needed_size, b_res->start + skip_nr, b_res->end, - 1, NULL, NULL); + 1, NULL, NULL, false); if (!ret) { *p = NULL; goto out; @@ -1206,7 +1217,7 @@ int probe_resource(struct resource *b_res, ret = __allocate_resource(b_res, busn_res, needed_size, b_res->start + skip_nr, b_res->end, - 1, NULL, NULL); + 1, NULL, NULL, false); /* ret must be 0 here*/ goto out; } |