Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb850f4d authored by Uladzislau Rezki (Sony)'s avatar Uladzislau Rezki (Sony) Committed by Linus Torvalds
Browse files

mm/vmap: add DEBUG_AUGMENT_PROPAGATE_CHECK macro

This macro adds some debug code to check that the augment tree is
maintained correctly, meaning that every node contains valid
subtree_max_size value.

By default this option is set to 0 and not active.  It requires
recompilation of the kernel to activate it.  Set to 1, compile the
kernel.

[urezki@gmail.com: v4]
  Link: http://lkml.kernel.org/r/20190406183508.25273-3-urezki@gmail.com
Link: http://lkml.kernel.org/r/20190402162531.10888-3-urezki@gmail.com


Signed-off-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
Reviewed-by: default avatarRoman Gushchin <guro@fb.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Joel Fernandes <joelaf@google.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 68ad4a33
Loading
Loading
Loading
Loading
+48 −0
Original line number Original line Diff line number Diff line
@@ -325,6 +325,8 @@ EXPORT_SYMBOL(vmalloc_to_pfn);


/*** Global kva allocator ***/
/*** Global kva allocator ***/


#define DEBUG_AUGMENT_PROPAGATE_CHECK 0

#define VM_LAZY_FREE	0x02
#define VM_LAZY_FREE	0x02
#define VM_VM_AREA	0x04
#define VM_VM_AREA	0x04


@@ -539,6 +541,48 @@ unlink_va(struct vmap_area *va, struct rb_root *root)
	}
	}
}
}


#if DEBUG_AUGMENT_PROPAGATE_CHECK
static void
augment_tree_propagate_check(struct rb_node *n)
{
	struct vmap_area *va;
	struct rb_node *node;
	unsigned long size;
	bool found = false;

	if (n == NULL)
		return;

	va = rb_entry(n, struct vmap_area, rb_node);
	size = va->subtree_max_size;
	node = n;

	while (node) {
		va = rb_entry(node, struct vmap_area, rb_node);

		if (get_subtree_max_size(node->rb_left) == size) {
			node = node->rb_left;
		} else {
			if (va_size(va) == size) {
				found = true;
				break;
			}

			node = node->rb_right;
		}
	}

	if (!found) {
		va = rb_entry(n, struct vmap_area, rb_node);
		pr_emerg("tree is corrupted: %lu, %lu\n",
			va_size(va), va->subtree_max_size);
	}

	augment_tree_propagate_check(n->rb_left);
	augment_tree_propagate_check(n->rb_right);
}
#endif

/*
/*
 * This function populates subtree_max_size from bottom to upper
 * This function populates subtree_max_size from bottom to upper
 * levels starting from VA point. The propagation must be done
 * levels starting from VA point. The propagation must be done
@@ -588,6 +632,10 @@ augment_tree_propagate_from(struct vmap_area *va)
		va->subtree_max_size = new_va_sub_max_size;
		va->subtree_max_size = new_va_sub_max_size;
		node = rb_parent(&va->rb_node);
		node = rb_parent(&va->rb_node);
	}
	}

#if DEBUG_AUGMENT_PROPAGATE_CHECK
	augment_tree_propagate_check(free_vmap_area_root.rb_node);
#endif
}
}


static void
static void