Message ID | 20240405201753.1176914-3-mcanal@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/v3d: Enable Big and Super Pages | expand |
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@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@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 > >
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); /** 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);
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> --- drivers/gpu/drm/drm_gem.c | 34 ++++++++++++++++++++++++++++++---- include/drm/drm_gem.h | 3 +++ 2 files changed, 33 insertions(+), 4 deletions(-) -- 2.44.0