@@ -688,8 +688,7 @@ insert_va_to_free_tree(struct vmap_area *va, struct rb_node *from)
* freed.
*/
static __always_inline void
-merge_or_add_vmap_area(struct vmap_area *va,
- struct rb_root *root, struct list_head *head)
+merge_or_add_va_to_free_tree(struct vmap_area *va)
{
struct vmap_area *sibling;
struct list_head *next;
@@ -701,7 +700,7 @@ merge_or_add_vmap_area(struct vmap_area *va,
* Find a place in the tree where VA potentially will be
* inserted, unless it is merged with its sibling/siblings.
*/
- link = find_va_links(va, root, NULL, &parent);
+ link = find_va_links(va, &free_vmap_area_root, NULL, &parent);
/*
* Get next node of VA to check if merging can be done.
@@ -717,7 +716,7 @@ merge_or_add_vmap_area(struct vmap_area *va,
* | |
* start end
*/
- if (next != head) {
+ if (next != &free_vmap_area_list) {
sibling = list_entry(next, struct vmap_area, list);
if (sibling->va_start == va->va_end) {
sibling->va_start = va->va_start;
@@ -725,9 +724,6 @@ merge_or_add_vmap_area(struct vmap_area *va,
/* Check and update the tree if needed. */
augment_tree_propagate_from(sibling);
- /* Remove this VA, it has been merged. */
- unlink_va(va, root);
-
/* Free vmap_area object. */
kmem_cache_free(vmap_area_cachep, va);
@@ -744,7 +740,7 @@ merge_or_add_vmap_area(struct vmap_area *va,
* | |
* start end
*/
- if (next->prev != head) {
+ if (next->prev != &free_vmap_area_list) {
sibling = list_entry(next->prev, struct vmap_area, list);
if (sibling->va_end == va->va_start) {
sibling->va_end = va->va_end;
@@ -753,7 +749,8 @@ merge_or_add_vmap_area(struct vmap_area *va,
augment_tree_propagate_from(sibling);
/* Remove this VA, it has been merged. */
- unlink_va(va, root);
+ if (merged)
+ unlink_va(va, &free_vmap_area_root);
/* Free vmap_area object. */
kmem_cache_free(vmap_area_cachep, va);
@@ -764,7 +761,8 @@ merge_or_add_vmap_area(struct vmap_area *va,
insert:
if (!merged) {
- link_va(va, root, parent, link, head);
+ link_va(va, &free_vmap_area_root, parent, link,
+ &free_vmap_area_list);
augment_tree_propagate_from(va);
}
}
@@ -1141,8 +1139,7 @@ static void __free_vmap_area(struct vmap_area *va)
/*
* Merge VA with its neighbors, otherwise just add it.
*/
- merge_or_add_vmap_area(va,
- &free_vmap_area_root, &free_vmap_area_list);
+ merge_or_add_va_to_free_tree(va);
}
/*
Since function merge_or_add_vmap_area() is only used to merge or add vmap area to the *FREE* tree, so rename it to merge_or_add_va_to_free_tree. Then this is obvious, merge_or_add_vmap_area() does not need parameters root and head, so remove them. Signed-off-by: Pengfei Li <lpf.vector@gmail.com> --- mm/vmalloc.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-)