|
@@ -35,6 +35,7 @@
|
|
|
#include "intel_drv.h"
|
|
|
#include "intel_frontbuffer.h"
|
|
|
#include "intel_mocs.h"
|
|
|
+#include "i915_gemfs.h"
|
|
|
#include <linux/dma-fence-array.h>
|
|
|
#include <linux/kthread.h>
|
|
|
#include <linux/reservation.h>
|
|
@@ -4256,6 +4257,30 @@ static const struct drm_i915_gem_object_ops i915_gem_object_ops = {
|
|
|
.pwrite = i915_gem_object_pwrite_gtt,
|
|
|
};
|
|
|
|
|
|
+static int i915_gem_object_create_shmem(struct drm_device *dev,
|
|
|
+ struct drm_gem_object *obj,
|
|
|
+ size_t size)
|
|
|
+{
|
|
|
+ struct drm_i915_private *i915 = to_i915(dev);
|
|
|
+ unsigned long flags = VM_NORESERVE;
|
|
|
+ struct file *filp;
|
|
|
+
|
|
|
+ drm_gem_private_object_init(dev, obj, size);
|
|
|
+
|
|
|
+ if (i915->mm.gemfs)
|
|
|
+ filp = shmem_file_setup_with_mnt(i915->mm.gemfs, "i915", size,
|
|
|
+ flags);
|
|
|
+ else
|
|
|
+ filp = shmem_file_setup("i915", size, flags);
|
|
|
+
|
|
|
+ if (IS_ERR(filp))
|
|
|
+ return PTR_ERR(filp);
|
|
|
+
|
|
|
+ obj->filp = filp;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
struct drm_i915_gem_object *
|
|
|
i915_gem_object_create(struct drm_i915_private *dev_priv, u64 size)
|
|
|
{
|
|
@@ -4280,7 +4305,7 @@ i915_gem_object_create(struct drm_i915_private *dev_priv, u64 size)
|
|
|
if (obj == NULL)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- ret = drm_gem_object_init(&dev_priv->drm, &obj->base, size);
|
|
|
+ ret = i915_gem_object_create_shmem(&dev_priv->drm, &obj->base, size);
|
|
|
if (ret)
|
|
|
goto fail;
|
|
|
|
|
@@ -4919,6 +4944,10 @@ i915_gem_load_init(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
spin_lock_init(&dev_priv->fb_tracking.lock);
|
|
|
|
|
|
+ err = i915_gemfs_init(dev_priv);
|
|
|
+ if (err)
|
|
|
+ DRM_NOTE("Unable to create a private tmpfs mount, hugepage support will be disabled(%d).\n", err);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_priorities:
|
|
@@ -4957,6 +4986,8 @@ void i915_gem_load_cleanup(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
/* And ensure that our DESTROY_BY_RCU slabs are truly destroyed */
|
|
|
rcu_barrier();
|
|
|
+
|
|
|
+ i915_gemfs_fini(dev_priv);
|
|
|
}
|
|
|
|
|
|
int i915_gem_freeze(struct drm_i915_private *dev_priv)
|