drm/gem: Create shmem GEM object in a given mountpoint

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 <mcanal@igalia.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240923141348.2422499-7-mcanal@igalia.com
This commit is contained in:
Maíra Canal 2024-09-23 10:55:10 -03:00
parent eb8d395f68
commit be431dfec9
No known key found for this signature in database
GPG Key ID: 6E388F05AB35B7CF
2 changed files with 29 additions and 4 deletions

View File

@ -49,7 +49,8 @@ static const struct drm_gem_object_funcs drm_gem_shmem_funcs = {
}; };
static struct drm_gem_shmem_object * 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_shmem_object *shmem;
struct drm_gem_object *obj; struct drm_gem_object *obj;
@ -76,7 +77,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
drm_gem_private_object_init(dev, obj, size); drm_gem_private_object_init(dev, obj, size);
shmem->map_wc = false; /* dma-buf mappings use always writecombine */ shmem->map_wc = false; /* dma-buf mappings use always writecombine */
} else { } else {
ret = drm_gem_object_init(dev, obj, size); ret = drm_gem_object_init_with_mnt(dev, obj, size, gemfs);
} }
if (ret) { if (ret) {
drm_gem_private_object_fini(obj); drm_gem_private_object_fini(obj);
@ -123,10 +124,31 @@ err_free:
*/ */
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(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); 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 * drm_gem_shmem_free - Free resources associated with a shmem GEM object
* @shmem: shmem GEM object to free * @shmem: shmem GEM object to free
@ -765,7 +787,7 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
size_t size = PAGE_ALIGN(attach->dmabuf->size); size_t size = PAGE_ALIGN(attach->dmabuf->size);
struct drm_gem_shmem_object *shmem; 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)) if (IS_ERR(shmem))
return ERR_CAST(shmem); return ERR_CAST(shmem);

View File

@ -97,6 +97,9 @@ struct drm_gem_shmem_object {
container_of(obj, struct drm_gem_shmem_object, base) 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(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_free(struct drm_gem_shmem_object *shmem);
void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem); void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);