]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/gem: Create a drm_gem_object_init_with_mnt() function
authorMaíra Canal <mcanal@igalia.com>
Mon, 23 Sep 2024 13:55:08 +0000 (10:55 -0300)
committerMaíra Canal <mcanal@igalia.com>
Wed, 25 Sep 2024 11:40:20 +0000 (08:40 -0300)
For some applications, such as applications that uses huge pages, we might
want to have a different mountpoint, for which we pass mount flags that
better match our usecase.

Therefore, create a new function `drm_gem_object_init_with_mnt()` that
allow us to define the tmpfs mountpoint where the GEM object will be
created. If this parameter is NULL, then we fallback to `shmem_file_setup()`.

Signed-off-by: Maíra Canal <mcanal@igalia.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240923141348.2422499-5-mcanal@igalia.com
drivers/gpu/drm/drm_gem.c
include/drm/drm_gem.h

index 149b8e25da5bbf3ce7beaa862a6f53ce402f6b44..ee811764c3df4b4e9c377a66afd4967512ba2001 100644 (file)
@@ -114,22 +114,32 @@ drm_gem_init(struct drm_device *dev)
 }
 
 /**
- * drm_gem_object_init - initialize an allocated shmem-backed GEM object
+ * drm_gem_object_init_with_mnt - initialize an allocated shmem-backed GEM
+ * object in a given shmfs mountpoint
+ *
  * @dev: drm_device the object should be initialized for
  * @obj: drm_gem_object to initialize
  * @size: object size
+ * @gemfs: tmpfs mount where the GEM object will be created. If NULL, use
+ * the usual tmpfs mountpoint (`shm_mnt`).
  *
  * Initialize an already allocated GEM object of the specified size with
  * shmfs backing store.
  */
-int drm_gem_object_init(struct drm_device *dev,
-                       struct drm_gem_object *obj, size_t size)
+int drm_gem_object_init_with_mnt(struct drm_device *dev,
+                                struct drm_gem_object *obj, size_t size,
+                                struct vfsmount *gemfs)
 {
        struct file *filp;
 
        drm_gem_private_object_init(dev, obj, size);
 
-       filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
+       if (gemfs)
+               filp = shmem_file_setup_with_mnt(gemfs, "drm mm object", size,
+                                                VM_NORESERVE);
+       else
+               filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
+
        if (IS_ERR(filp))
                return PTR_ERR(filp);
 
@@ -137,6 +147,22 @@ int drm_gem_object_init(struct drm_device *dev,
 
        return 0;
 }
+EXPORT_SYMBOL(drm_gem_object_init_with_mnt);
+
+/**
+ * drm_gem_object_init - initialize an allocated shmem-backed GEM object
+ * @dev: drm_device the object should be initialized for
+ * @obj: drm_gem_object to initialize
+ * @size: object size
+ *
+ * Initialize an already allocated GEM object of the specified size with
+ * shmfs backing store.
+ */
+int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj,
+                       size_t size)
+{
+       return drm_gem_object_init_with_mnt(dev, obj, size, NULL);
+}
 EXPORT_SYMBOL(drm_gem_object_init);
 
 /**
index bae4865b2101ae4467b6253cb95fbb6966e0acdb..2ebf6e10cc441e3749a14440c75ce06bd97d0a92 100644 (file)
@@ -472,6 +472,9 @@ void drm_gem_object_release(struct drm_gem_object *obj);
 void drm_gem_object_free(struct kref *kref);
 int drm_gem_object_init(struct drm_device *dev,
                        struct drm_gem_object *obj, size_t size);
+int drm_gem_object_init_with_mnt(struct drm_device *dev,
+                                struct drm_gem_object *obj, size_t size,
+                                struct vfsmount *gemfs);
 void drm_gem_private_object_init(struct drm_device *dev,
                                 struct drm_gem_object *obj, size_t size);
 void drm_gem_private_object_fini(struct drm_gem_object *obj);