On 05/04/2024 19:29, Maíra Canal wrote:
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 <mca...@igalia.com>
---
  drivers/gpu/drm/drm_gem.c | 34 ++++++++++++++++++++++++++++++----
  include/drm/drm_gem.h     |  3 +++
  2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index d4bbc5d109c8..74ebe68e3d61 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -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);

I would be tempted to static inline this one but see what other people think. (One wise kernel legend was once annoyed by trivial wrappers / function calls. But some other are then annoyed by static inlines.. so dunno.) For either flavour:

Reviewed-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com>

Regards,

Tvrtko


  /**
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index bae4865b2101..2ebf6e10cc44 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -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);
--
2.44.0


Reply via email to