static inline void *mmu_memory_cache_alloc_obj(struct kvm_mmu_memory_cache *mc,
                                               gfp_t gfp_flags)
 {
+       void *page;
+
        gfp_flags |= mc->gfp_zero;
 
        if (mc->kmem_cache)
                return kmem_cache_alloc(mc->kmem_cache, gfp_flags);
-       else
-               return (void *)__get_free_page(gfp_flags);
+
+       page = (void *)__get_free_page(gfp_flags);
+       if (page && mc->init_value)
+               memset64(page, mc->init_value, PAGE_SIZE / sizeof(u64));
+       return page;
 }
 
 int __kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int capacity, int min)
                if (WARN_ON_ONCE(!capacity))
                        return -EIO;
 
+               /*
+                * Custom init values can be used only for page allocations,
+                * and obviously conflict with __GFP_ZERO.
+                */
+               if (WARN_ON_ONCE(mc->init_value && (mc->kmem_cache || mc->gfp_zero)))
+                       return -EIO;
+
                mc->objects = kvmalloc_array(capacity, sizeof(void *), gfp);
                if (!mc->objects)
                        return -ENOMEM;