if (sibling->va_start == va->va_end) {
                        sibling->va_start = va->va_start;
 
-                       /* Check and update the tree if needed. */
-                       augment_tree_propagate_from(sibling);
-
                        /* Free vmap_area object. */
                        kmem_cache_free(vmap_area_cachep, va);
 
        if (next->prev != head) {
                sibling = list_entry(next->prev, struct vmap_area, list);
                if (sibling->va_end == va->va_start) {
-                       sibling->va_end = va->va_end;
-
-                       /* Check and update the tree if needed. */
-                       augment_tree_propagate_from(sibling);
-
+                       /*
+                        * If both neighbors are coalesced, it is important
+                        * to unlink the "next" node first, followed by merging
+                        * with "previous" one. Otherwise the tree might not be
+                        * fully populated if a sibling's augmented value is
+                        * "normalized" because of rotation operations.
+                        */
                        if (merged)
                                unlink_va(va, root);
 
+                       sibling->va_end = va->va_end;
+
                        /* Free vmap_area object. */
                        kmem_cache_free(vmap_area_cachep, va);
 
        }
 
 insert:
-       if (!merged) {
+       if (!merged)
                link_va(va, root, parent, link, head);
-               augment_tree_propagate_from(va);
-       }
 
+       /*
+        * Last step is to check and update the tree.
+        */
+       augment_tree_propagate_from(va);
        return va;
 }