diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 12bd82e6554ecfb2333507a8d09c39509198ef18..4df66e1abeb15ab4773605e13bb918d01309a1d2 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1504,7 +1504,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
 			addr))
 		return;
 
-	area = remove_vm_area(addr);
+	area = find_vmap_area((unsigned long)addr)->vm;
 	if (unlikely(!area)) {
 		WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n",
 				addr);
@@ -1514,6 +1514,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
 	debug_check_no_locks_freed(addr, get_vm_area_size(area));
 	debug_check_no_obj_freed(addr, get_vm_area_size(area));
 
+	remove_vm_area(addr);
 	if (deallocate_pages) {
 		int i;