free_priv:
        if (dev_priv->requests)
                kmem_cache_destroy(dev_priv->requests);
+       if (dev_priv->vmas)
+               kmem_cache_destroy(dev_priv->vmas);
        if (dev_priv->objects)
                kmem_cache_destroy(dev_priv->objects);
        kfree(dev_priv);
 
        if (dev_priv->requests)
                kmem_cache_destroy(dev_priv->requests);
+       if (dev_priv->vmas)
+               kmem_cache_destroy(dev_priv->vmas);
        if (dev_priv->objects)
                kmem_cache_destroy(dev_priv->objects);
 
 
 struct drm_i915_private {
        struct drm_device *dev;
        struct kmem_cache *objects;
+       struct kmem_cache *vmas;
        struct kmem_cache *requests;
 
        const struct intel_device_info info;
 
 
        list_del(&vma->vma_link);
 
-       kfree(vma);
+       kmem_cache_free(to_i915(vma->obj->base.dev)->vmas, vma);
 }
 
 static void
                                  sizeof(struct drm_i915_gem_object), 0,
                                  SLAB_HWCACHE_ALIGN,
                                  NULL);
+       dev_priv->vmas =
+               kmem_cache_create("i915_gem_vma",
+                                 sizeof(struct i915_vma), 0,
+                                 SLAB_HWCACHE_ALIGN,
+                                 NULL);
        dev_priv->requests =
                kmem_cache_create("i915_gem_request",
                                  sizeof(struct drm_i915_gem_request), 0,
 
 
        if (WARN_ON(i915_is_ggtt(vm) != !!ggtt_view))
                return ERR_PTR(-EINVAL);
-       vma = kzalloc(sizeof(*vma), GFP_KERNEL);
+
+       vma = kmem_cache_zalloc(to_i915(obj->base.dev)->vmas, GFP_KERNEL);
        if (vma == NULL)
                return ERR_PTR(-ENOMEM);