Unverified Commit 0992b254 authored by Maíra Canal's avatar Maíra Canal
Browse files

drm/gem: Create a drm_gem_object_init_with_mnt() function



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: default avatarMaíra Canal <mcanal@igalia.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240923141348.2422499-5-mcanal@igalia.com
parent 56cf76ed
Loading
Loading
Loading
Loading
+30 −4
Original line number Diff line number Diff line
@@ -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);

	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);

/**
+3 −0
Original line number Diff line number Diff line
@@ -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);