Create a function `drm_gem_shmem_create_with_mnt()`, similar to
`drm_gem_shmem_create()`, that has a mountpoint as a argument. This
function will create a shmem GEM object in a given tmpfs mountpoint.

This function will be useful for drivers that have a special mountpoint
with flags enabled.

Signed-off-by: Maíra Canal <mca...@igalia.com>
---
 drivers/gpu/drm/drm_gem_shmem_helper.c | 30 ++++++++++++++++++++++----
 include/drm/drm_gem_shmem_helper.h     |  3 +++
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 15635b330ca8..1097def870a2 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -50,7 +50,8 @@ static const struct drm_gem_object_funcs drm_gem_shmem_funcs 
= {
 };

 static struct drm_gem_shmem_object *
-__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
+__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
+                      struct vfsmount *gemfs)
 {
        struct drm_gem_shmem_object *shmem;
        struct drm_gem_object *obj;
@@ -77,7 +78,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, 
bool private)
                drm_gem_private_object_init(dev, obj, size);
                shmem->map_wc = false; /* dma-buf mappings use always 
writecombine */
        } else {
-               ret = drm_gem_object_init(dev, obj, size, NULL);
+               ret = drm_gem_object_init(dev, obj, size, gemfs);
        }
        if (ret) {
                drm_gem_private_object_fini(obj);
@@ -124,10 +125,31 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t 
size, bool private)
  */
 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, 
size_t size)
 {
-       return __drm_gem_shmem_create(dev, size, false);
+       return __drm_gem_shmem_create(dev, size, false, NULL);
 }
 EXPORT_SYMBOL_GPL(drm_gem_shmem_create);

+/**
+ * drm_gem_shmem_create_with_mnt - Allocate an object with the given size in a
+ * given mountpoint
+ * @dev: DRM device
+ * @size: Size of the object to allocate
+ * @gemfs: tmpfs mount where the GEM object will be created
+ *
+ * This function creates a shmem GEM object in a given tmpfs mountpoint.
+ *
+ * Returns:
+ * A struct drm_gem_shmem_object * on success or an ERR_PTR()-encoded negative
+ * error code on failure.
+ */
+struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_device 
*dev,
+                                                          size_t size,
+                                                          struct vfsmount 
*gemfs)
+{
+       return __drm_gem_shmem_create(dev, size, false, gemfs);
+}
+EXPORT_SYMBOL_GPL(drm_gem_shmem_create_with_mnt);
+
 /**
  * drm_gem_shmem_free - Free resources associated with a shmem GEM object
  * @shmem: shmem GEM object to free
@@ -759,7 +781,7 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
        size_t size = PAGE_ALIGN(attach->dmabuf->size);
        struct drm_gem_shmem_object *shmem;

-       shmem = __drm_gem_shmem_create(dev, size, true);
+       shmem = __drm_gem_shmem_create(dev, size, true, NULL);
        if (IS_ERR(shmem))
                return ERR_CAST(shmem);

diff --git a/include/drm/drm_gem_shmem_helper.h 
b/include/drm/drm_gem_shmem_helper.h
index bf0c31aa8fbe..ad5e32d01892 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -97,6 +97,9 @@ struct drm_gem_shmem_object {
        container_of(obj, struct drm_gem_shmem_object, base)

 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, 
size_t size);
+struct drm_gem_shmem_object *drm_gem_shmem_create_with_mnt(struct drm_device 
*dev,
+                                                          size_t size,
+                                                          struct vfsmount 
*gemfs);
 void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem);

 void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);
--
2.43.0

Reply via email to