aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2012-09-17 22:25:34 -0700
committerYinghai Lu <yinghai@kernel.org>2012-09-17 22:25:34 -0700
commitd5266a6df5ef874c81be39e694627755e5769fde (patch)
tree738cb49bda1cbf0af7e8c0249b1d783c5de0820b
parent4ffe83708c1722e75670410514da8b20a0c23b1f (diff)
downloadlinux-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.h8
-rw-r--r--kernel/resource.c27
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;
}