[PATCH v2 2/6] drm/gem: Create a drm_gem_object_init_with_mnt() function
Tvrtko Ursulin
tvrtko.ursulin at igalia.com
Mon Apr 15 11:15:58 UTC 2024
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 <mcanal at 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.ursulin at 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
>
>
More information about the dri-devel
mailing list