/* Find vmap_areas end addresses of which enclose @end. ie. if not NULL, *pnext->va_end > @end and *pprev->va_end <= @end.  */
static bool pvm_find_next_prev(unsigned long end, struct vmap_area **pnext, struct vmap_area **pprev)
/* Find vmap_areas end addresses of which enclose @end. ie. if not NULL, *pnext->va_end > @end and *pprev->va_end <= @end.  */
static bool pvm_find_next_prev(unsigned long end, struct vmap_area **pnext, struct vmap_area **pprev)
{
	struct rb_node *n = vmap_area_root.rb_node;
	struct vmap_area *va = NULL;
	while (n) {
		va = rb_entry(n, struct vmap_area, rb_node);
		if (end < va->va_end)
			n = n->rb_left;
		else if (end > va->va_end)
			n = n->rb_right;
		else
			break;
	}
	if (!va)
		return false;
	if (va->va_end > end) {
		*pnext = va;
		*pprev = node_to_va(rb_prev(&(*pnext)->rb_node));
	} else {
		*pprev = va;
		*pnext = node_to_va(rb_next(&(*pprev)->rb_node));
	}
	return true;
}