[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