]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/gem/shmem: Extract drm_gem_shmem_init() from drm_gem_shmem_create()
authorLyude Paul <lyude@redhat.com>
Thu, 11 Sep 2025 22:57:38 +0000 (18:57 -0400)
committerLyude Paul <lyude@redhat.com>
Fri, 12 Sep 2025 23:04:29 +0000 (19:04 -0400)
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: Lyude Paul <lyude@redhat.com>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Link: https://lore.kernel.org/r/20250911230147.650077-2-lyude@redhat.com
drivers/gpu/drm/drm_gem_shmem_helper.c
include/drm/drm_gem_shmem_helper.h

index 5d1349c34afd3dee612d0f93bd3eea8b90dc3045..b20a7b75c722888ed9f2e1c0d106b8d9b7e9b45b 100644 (file)
@@ -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,14 +86,55 @@ __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;
+}
 
-       return ERR_PTR(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
index 92f5db84b9c22e37993e6927b96894ea693821aa..235dc33127b9a8dba5e83a54f02e167521fd8b89 100644 (file)
@@ -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,