resource: add release_child_resources
Useful for freeing a portion of the resource tree, e.g. when trying to reallocate resources more efficiently. Signed-off-by: Yinghai Lu <yinghai@kernel.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
@@ -112,6 +112,7 @@ extern struct resource iomem_resource;
|
|||||||
|
|
||||||
extern int request_resource(struct resource *root, struct resource *new);
|
extern int request_resource(struct resource *root, struct resource *new);
|
||||||
extern int release_resource(struct resource *new);
|
extern int release_resource(struct resource *new);
|
||||||
|
void release_child_resources(struct resource *new);
|
||||||
extern void reserve_region_with_split(struct resource *root,
|
extern void reserve_region_with_split(struct resource *root,
|
||||||
resource_size_t start, resource_size_t end,
|
resource_size_t start, resource_size_t end,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
@@ -188,6 +188,36 @@ static int __release_resource(struct resource *old)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __release_child_resources(struct resource *r)
|
||||||
|
{
|
||||||
|
struct resource *tmp, *p;
|
||||||
|
resource_size_t size;
|
||||||
|
|
||||||
|
p = r->child;
|
||||||
|
r->child = NULL;
|
||||||
|
while (p) {
|
||||||
|
tmp = p;
|
||||||
|
p = p->sibling;
|
||||||
|
|
||||||
|
tmp->parent = NULL;
|
||||||
|
tmp->sibling = NULL;
|
||||||
|
__release_child_resources(tmp);
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "release child resource %pR\n", tmp);
|
||||||
|
/* need to restore size, and keep flags */
|
||||||
|
size = resource_size(tmp);
|
||||||
|
tmp->start = 0;
|
||||||
|
tmp->end = size - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_child_resources(struct resource *r)
|
||||||
|
{
|
||||||
|
write_lock(&resource_lock);
|
||||||
|
__release_child_resources(r);
|
||||||
|
write_unlock(&resource_lock);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* request_resource - request and reserve an I/O or memory resource
|
* request_resource - request and reserve an I/O or memory resource
|
||||||
* @root: root resource descriptor
|
* @root: root resource descriptor
|
||||||
|
Reference in New Issue
Block a user