read_lock(&kvm->mmu_lock);
        pgt = vcpu->arch.hw_mmu->pgt;
-       if (mmu_invalidate_retry(kvm, mmu_seq))
+       if (mmu_invalidate_retry(kvm, mmu_seq)) {
+               ret = -EAGAIN;
                goto out_unlock;
+       }
 
        /*
         * If we are not forced to use page mapping, check if we are
                                             memcache,
                                             KVM_PGTABLE_WALK_HANDLE_FAULT |
                                             KVM_PGTABLE_WALK_SHARED);
+out_unlock:
+       read_unlock(&kvm->mmu_lock);
 
        /* Mark the page dirty only if the fault is handled successfully */
        if (writable && !ret) {
                mark_page_dirty_in_slot(kvm, memslot, gfn);
        }
 
-out_unlock:
-       read_unlock(&kvm->mmu_lock);
        kvm_release_pfn_clean(pfn);
        return ret != -EAGAIN ? ret : 0;
 }