aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/resource.c')
-rw-r--r--kernel/resource.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/kernel/resource.c b/kernel/resource.c
index af96c1e4b54..24e9e60c145 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -188,6 +188,36 @@ static int __release_resource(struct resource *old)
188 return -EINVAL; 188 return -EINVAL;
189} 189}
190 190
191static void __release_child_resources(struct resource *r)
192{
193 struct resource *tmp, *p;
194 resource_size_t size;
195
196 p = r->child;
197 r->child = NULL;
198 while (p) {
199 tmp = p;
200 p = p->sibling;
201
202 tmp->parent = NULL;
203 tmp->sibling = NULL;
204 __release_child_resources(tmp);
205
206 printk(KERN_DEBUG "release child resource %pR\n", tmp);
207 /* need to restore size, and keep flags */
208 size = resource_size(tmp);
209 tmp->start = 0;
210 tmp->end = size - 1;
211 }
212}
213
214void release_child_resources(struct resource *r)
215{
216 write_lock(&resource_lock);
217 __release_child_resources(r);
218 write_unlock(&resource_lock);
219}
220
191/** 221/**
192 * request_resource - request and reserve an I/O or memory resource 222 * request_resource - request and reserve an I/O or memory resource
193 * @root: root resource descriptor 223 * @root: root resource descriptor
@@ -303,8 +333,10 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
303static int find_resource(struct resource *root, struct resource *new, 333static int find_resource(struct resource *root, struct resource *new,
304 resource_size_t size, resource_size_t min, 334 resource_size_t size, resource_size_t min,
305 resource_size_t max, resource_size_t align, 335 resource_size_t max, resource_size_t align,
306 void (*alignf)(void *, struct resource *, 336 resource_size_t (*alignf)(void *,
307 resource_size_t, resource_size_t), 337 const struct resource *,
338 resource_size_t,
339 resource_size_t),
308 void *alignf_data) 340 void *alignf_data)
309{ 341{
310 struct resource *this = root->child; 342 struct resource *this = root->child;
@@ -330,7 +362,7 @@ static int find_resource(struct resource *root, struct resource *new,
330 tmp.end = max; 362 tmp.end = max;
331 tmp.start = ALIGN(tmp.start, align); 363 tmp.start = ALIGN(tmp.start, align);
332 if (alignf) 364 if (alignf)
333 alignf(alignf_data, &tmp, size, align); 365 tmp.start = alignf(alignf_data, &tmp, size, align);
334 if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) { 366 if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) {
335 new->start = tmp.start; 367 new->start = tmp.start;
336 new->end = tmp.start + size - 1; 368 new->end = tmp.start + size - 1;
@@ -358,8 +390,10 @@ static int find_resource(struct resource *root, struct resource *new,
358int allocate_resource(struct resource *root, struct resource *new, 390int allocate_resource(struct resource *root, struct resource *new,
359 resource_size_t size, resource_size_t min, 391 resource_size_t size, resource_size_t min,
360 resource_size_t max, resource_size_t align, 392 resource_size_t max, resource_size_t align,
361 void (*alignf)(void *, struct resource *, 393 resource_size_t (*alignf)(void *,
362 resource_size_t, resource_size_t), 394 const struct resource *,
395 resource_size_t,
396 resource_size_t),
363 void *alignf_data) 397 void *alignf_data)
364{ 398{
365 int err; 399 int err;