Commit e3f4bdaf authored by Lyude Paul's avatar Lyude Paul
Browse files

drm/gem/shmem: Extract drm_gem_shmem_init() from drm_gem_shmem_create()



With gem objects in rust, the most ideal way for us to be able to handle
gem shmem object creation is to be able to handle the memory allocation of
a gem object ourselves - and then have the DRM gem shmem helpers initialize
the object we've allocated afterwards. So, let's split out
drm_gem_shmem_init() from drm_gem_shmem_create() to allow for doing this.

Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Reviewed-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
Link: https://lore.kernel.org/r/20250911230147.650077-2-lyude@redhat.com
parent 27ed0d64
Loading
Loading
Loading
Loading
+50 −25
Original line number Diff line number Diff line
@@ -48,28 +48,12 @@ static const struct drm_gem_object_funcs drm_gem_shmem_funcs = {
	.vm_ops = &drm_gem_shmem_vm_ops,
};

static struct drm_gem_shmem_object *
__drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
		       struct vfsmount *gemfs)
static int __drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem,
				size_t size, bool private, struct vfsmount *gemfs)
{
	struct drm_gem_shmem_object *shmem;
	struct drm_gem_object *obj;
	struct drm_gem_object *obj = &shmem->base;
	int ret = 0;

	size = PAGE_ALIGN(size);

	if (dev->driver->gem_create_object) {
		obj = dev->driver->gem_create_object(dev, size);
		if (IS_ERR(obj))
			return ERR_CAST(obj);
		shmem = to_drm_gem_shmem_obj(obj);
	} else {
		shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
		if (!shmem)
			return ERR_PTR(-ENOMEM);
		obj = &shmem->base;
	}

	if (!obj->funcs)
		obj->funcs = &drm_gem_shmem_funcs;

@@ -81,7 +65,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
	}
	if (ret) {
		drm_gem_private_object_fini(obj);
		goto err_free;
		return ret;
	}

	ret = drm_gem_create_mmap_offset(obj);
@@ -102,15 +86,56 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private,
				     __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
	}

	return shmem;

	return 0;
err_release:
	drm_gem_object_release(obj);
err_free:
	kfree(obj);
	return ret;
}

/**
 * drm_gem_shmem_init - Initialize an allocated object.
 * @dev: DRM device
 * @obj: The allocated shmem GEM object.
 *
 * Returns:
 * 0 on success, or a negative error code on failure.
 */
int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, size_t size)
{
	return __drm_gem_shmem_init(dev, shmem, size, false, NULL);
}
EXPORT_SYMBOL_GPL(drm_gem_shmem_init);

static struct drm_gem_shmem_object *
__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_object *obj;
	int ret = 0;

	size = PAGE_ALIGN(size);

	if (dev->driver->gem_create_object) {
		obj = dev->driver->gem_create_object(dev, size);
		if (IS_ERR(obj))
			return ERR_CAST(obj);
		shmem = to_drm_gem_shmem_obj(obj);
	} else {
		shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
		if (!shmem)
			return ERR_PTR(-ENOMEM);
		obj = &shmem->base;
	}

	ret = __drm_gem_shmem_init(dev, shmem, size, private, gemfs);
	if (ret) {
		kfree(obj);
		return ERR_PTR(ret);
	}

	return shmem;
}
/**
 * drm_gem_shmem_create - Allocate an object with the given size
 * @dev: DRM device
+1 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ struct drm_gem_shmem_object {
#define to_drm_gem_shmem_obj(obj) \
	container_of(obj, struct drm_gem_shmem_object, base)

int drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_object *shmem, 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,