/* Attempt to expand an old mapping */
        /* Check next */
-       if (next && next->vm_start == end && !vma_policy(next) &&
-           can_vma_merge_before(&vmg)) {
+       if (next && next->vm_start == end && can_vma_merge_before(&vmg)) {
                merge_end = next->vm_end;
                vma = next;
                vmg.pgoff = next->vm_pgoff - pglen;
        }
 
        /* Check prev */
-       if (prev && prev->vm_end == addr && !vma_policy(prev) &&
-           can_vma_merge_after(&vmg)) {
+       if (prev && prev->vm_end == addr && can_vma_merge_after(&vmg)) {
                merge_start = prev->vm_start;
                vma = prev;
                vmg.pgoff = prev->vm_pgoff;
         * Expand the existing vma if possible; Note that singular lists do not
         * occur after forking, so the expand will only happen on new VMAs.
         */
-       if (vma && vma->vm_end == addr && !vma_policy(vma)) {
+       if (vma && vma->vm_end == addr) {
                VMG_STATE(vmg, mm, vmi, addr, addr + len, flags, PHYS_PFN(addr));
 
                vmg.prev = vma;
 
         */
        bool may_remove_vma = merge_next;
 
+       if (!mpol_equal(vmg->policy, vma_policy(vma)))
+               return false;
        /*
         * VM_SOFTDIRTY should not prevent from VMA merging, if we
         * match the flags but dirty bit -- the caller should mark
                vma_pgoff = prev->vm_pgoff;
 
                /* Can we merge the predecessor? */
-               if (addr == prev->vm_end && mpol_equal(vma_policy(prev), vmg->policy)
-                   && can_vma_merge_after(vmg)) {
-
+               if (addr == prev->vm_end && can_vma_merge_after(vmg)) {
                        merge_prev = true;
                        vma_prev(vmg->vmi);
                }
        }
 
        /* Can we merge the successor? */
-       if (next && mpol_equal(vmg->policy, vma_policy(next)) &&
-           can_vma_merge_before(vmg)) {
+       if (next && can_vma_merge_before(vmg)) {
                merge_next = true;
        }