}
 }
 
-static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu)
+static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu, bool maybe_indirect)
 {
        int r;
 
                                   PT64_ROOT_MAX_LEVEL);
        if (r)
                return r;
-       r = mmu_topup_memory_cache(&vcpu->arch.mmu_gfn_array_cache,
-                                  PT64_ROOT_MAX_LEVEL);
-       if (r)
-               return r;
+       if (maybe_indirect) {
+               r = mmu_topup_memory_cache(&vcpu->arch.mmu_gfn_array_cache,
+                                          PT64_ROOT_MAX_LEVEL);
+               if (r)
+                       return r;
+       }
        return mmu_topup_memory_cache(&vcpu->arch.mmu_page_header_cache,
                                      PT64_ROOT_MAX_LEVEL);
 }
        if (fast_page_fault(vcpu, gpa, error_code))
                return RET_PF_RETRY;
 
-       r = mmu_topup_memory_caches(vcpu);
+       r = mmu_topup_memory_caches(vcpu, false);
        if (r)
                return r;
 
 {
        int r;
 
-       r = mmu_topup_memory_caches(vcpu);
+       r = mmu_topup_memory_caches(vcpu, !vcpu->arch.mmu->direct_map);
        if (r)
                goto out;
        r = mmu_alloc_roots(vcpu);
         * or not since pte prefetch is skiped if it does not have
         * enough objects in the cache.
         */
-       mmu_topup_memory_caches(vcpu);
+       mmu_topup_memory_caches(vcpu, true);
 
        spin_lock(&vcpu->kvm->mmu_lock);
 
 
                return RET_PF_EMULATE;
        }
 
-       r = mmu_topup_memory_caches(vcpu);
+       r = mmu_topup_memory_caches(vcpu, true);
        if (r)
                return r;
 
         * No need to check return value here, rmap_can_add() can
         * help us to skip pte prefetch later.
         */
-       mmu_topup_memory_caches(vcpu);
+       mmu_topup_memory_caches(vcpu, true);
 
        if (!VALID_PAGE(root_hpa)) {
                WARN_ON(1);