All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <ckoenig.leichtzumerken@gmail.com>
To: thomas.hellstrom@linux.intel.com, dakr@kernel.org,
	ecourtney@nvidia.com, matthew.brost@intel.com,
	nat@pixelcluster.dev, dri-devel@lists.freedesktop.org,
	intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	amd-gfx@lists.freedesktop.org
Subject: [PATCH 05/11] drm/gem: Convert drm_gem_private_object_init to return error code v2
Date: Thu,  3 Sep 2026 15:28:00 +0200	[thread overview]
Message-ID: <20260903134408.105317-6-christian.koenig@amd.com> (raw)
In-Reply-To: <20260903134408.105317-1-christian.koenig@amd.com>

Change drm_gem_private_object_init() to return an int instead of void,
allowing it to report errors instead of crashing the kernel with BUG_ON.
The function now returns -EINVAL if the size parameter is not page-aligned,
rather than using BUG_ON to crash the system.

This change improves error handling throughout the DRM subsystem by
replacing a kernel panic with graceful error propagation. All 60+ call
sites across the DRM and accelerator drivers have been updated to check
the return value and handle errors appropriately.

Updated components:
- Core: drm_gem.c, drm_gem_shmem_helper.c, drm_gem_dma_helper.c, drm_gpuvm.c
- AMD: amdgpu, radeon
- Intel: i915 (multiple modules), xe, gvt
- ARM/Mobile: armada, etnaviv, gma500, msm, omapdrm, panthor, imagination
- Virtual: virtio, vmwgfx
- Other: renesas/rcar-du
- Accelerators: qaic, amdxdna
- Tests: drm_exec_test, ttm_bo_validate_test, i915 selftests

Each caller now properly checks the return value and either propagates
the error up the call stack or handles it with appropriate cleanup.

v2: add missing i915_gem_object_free export for GVT,
    add missing kfree() in vmw_bo_init,
    add missing xe_bo_free() in xe_bo_init_locked(),
    fix order in amdxdna_drm_create_dev_bo()

Signed-off-by: Christian König <christian.koenig@amd.com>
Assisted-by: Claude:Sonnet 4
---
 drivers/accel/amdxdna/amdxdna_gem.c           | 16 +++---
 drivers/accel/qaic/qaic_data.c                | 10 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c    |  6 ++-
 drivers/gpu/drm/armada/armada_gem.c           |  7 ++-
 drivers/gpu/drm/drm_gem.c                     | 17 ++++--
 drivers/gpu/drm/drm_gem_dma_helper.c          |  2 +-
 drivers/gpu/drm/drm_gem_shmem_helper.c        |  2 +-
 drivers/gpu/drm/drm_gpuvm.c                   |  7 ++-
 drivers/gpu/drm/etnaviv/etnaviv_gem.c         |  6 ++-
 drivers/gpu/drm/gma500/gem.c                  |  4 +-
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c    |  7 ++-
 drivers/gpu/drm/i915/gem/i915_gem_internal.c  |  8 ++-
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c     |  5 +-
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c    |  5 +-
 drivers/gpu/drm/i915/gem/i915_gem_ttm.c       |  5 +-
 drivers/gpu/drm/i915/gem/i915_gem_userptr.c   |  7 ++-
 .../drm/i915/gem/selftests/huge_gem_object.c  |  8 ++-
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 15 +++++-
 drivers/gpu/drm/i915/gvt/dmabuf.c             |  8 ++-
 drivers/gpu/drm/i915/intel_gvt.c              |  1 +
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c |  6 ++-
 drivers/gpu/drm/i915/selftests/mock_region.c  |  6 ++-
 drivers/gpu/drm/imagination/pvr_vm.c          |  8 ++-
 drivers/gpu/drm/msm/msm_gem.c                 |  6 ++-
 drivers/gpu/drm/omapdrm/omap_gem.c            |  4 +-
 drivers/gpu/drm/panthor/panthor_gem.c         |  6 ++-
 drivers/gpu/drm/radeon/radeon_object.c        |  6 ++-
 drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c |  6 ++-
 drivers/gpu/drm/tests/drm_exec_test.c         | 18 ++++---
 .../gpu/drm/ttm/tests/ttm_bo_validate_test.c  | 54 ++++++++++++-------
 drivers/gpu/drm/virtio/virtgpu_prime.c        |  6 ++-
 drivers/gpu/drm/virtio/virtgpu_vram.c         |  6 ++-
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c            |  6 ++-
 drivers/gpu/drm/xe/xe_bo.c                    |  6 ++-
 drivers/gpu/drm/xe/xe_mmio_gem.c              |  6 ++-
 include/drm/drm_gem.h                         |  4 +-
 36 files changed, 232 insertions(+), 68 deletions(-)

diff --git a/drivers/accel/amdxdna/amdxdna_gem.c b/drivers/accel/amdxdna/amdxdna_gem.c
index a3e8da88683f..56e1d8bb77ce 100644
--- a/drivers/accel/amdxdna/amdxdna_gem.c
+++ b/drivers/accel/amdxdna/amdxdna_gem.c
@@ -1017,15 +1017,19 @@ amdxdna_drm_create_dev_bo(struct drm_device *dev,
 	 */
 	abo->client = client;
 
-	ret = amdxdna_gem_heap_alloc(abo);
-	if (ret) {
-		amdxdna_gem_destroy_obj(abo);
-		return ERR_PTR(ret);
-	}
+	ret = drm_gem_private_object_init(dev, gobj, aligned_sz);
+	if (ret)
+		goto err;
 
-	drm_gem_private_object_init(dev, gobj, aligned_sz);
+	ret = amdxdna_gem_heap_alloc(abo);
+	if (ret)
+		goto err;
 
 	return abo;
+
+err:
+	amdxdna_gem_destroy_obj(abo);
+	return ERR_PTR(ret);
 }
 
 int amdxdna_drm_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
diff --git a/drivers/accel/qaic/qaic_data.c b/drivers/accel/qaic/qaic_data.c
index 26c23b70c13a..580460cea859 100644
--- a/drivers/accel/qaic/qaic_data.c
+++ b/drivers/accel/qaic/qaic_data.c
@@ -770,7 +770,11 @@ int qaic_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *fi
 	}
 	obj = &bo->base;
 
-	drm_gem_private_object_init(dev, obj, size);
+	ret = drm_gem_private_object_init(dev, obj, size);
+	if (ret) {
+		kfree(bo);
+		goto unlock_dev_srcu;
+	}
 
 	obj->funcs = &qaic_gem_funcs;
 	ret = create_sgt(qdev, &bo->sgt, size);
@@ -867,7 +871,9 @@ struct drm_gem_object *qaic_gem_prime_import(struct drm_device *dev, struct dma_
 		goto size_align_fail;
 	}
 
-	drm_gem_private_object_init(dev, obj, attach->dmabuf->size);
+	ret = drm_gem_private_object_init(dev, obj, attach->dmabuf->size);
+	if (ret)
+		goto size_align_fail;
 	/*
 	 * skipping dma_buf_map_attachment() as we do not know the direction
 	 * just yet. Once the direction is known in the subsequent IOCTL to
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index f98bfba59a2c..6c5182d54f7d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -663,7 +663,11 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
 	bo = kvzalloc(bp->bo_ptr_size, GFP_KERNEL);
 	if (bo == NULL)
 		return -ENOMEM;
-	drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
+	r = drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
+	if (r) {
+		kvfree(bo);
+		return r;
+	}
 	bo->tbo.base.funcs = &amdgpu_gem_object_funcs;
 	bo->vm_bo = NULL;
 	bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c
index da7335cbe82d..da6f5506743e 100644
--- a/drivers/gpu/drm/armada/armada_gem.c
+++ b/drivers/gpu/drm/armada/armada_gem.c
@@ -197,6 +197,7 @@ struct armada_gem_object *
 armada_gem_alloc_private_object(struct drm_device *dev, size_t size)
 {
 	struct armada_gem_object *obj;
+	int ret;
 
 	size = roundup_gem_size(size);
 
@@ -206,7 +207,11 @@ armada_gem_alloc_private_object(struct drm_device *dev, size_t size)
 
 	obj->obj.funcs = &armada_gem_object_funcs;
 
-	drm_gem_private_object_init(dev, &obj->obj, size);
+	ret = drm_gem_private_object_init(dev, &obj->obj, size);
+	if (ret) {
+		kfree(obj);
+		return NULL;
+	}
 
 	DRM_DEBUG_DRIVER("alloc private obj %p size %zu\n", obj, size);
 
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index bbcbd25f014f..d2ce18bbddea 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -187,8 +187,11 @@ int drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj,
 	struct vfsmount *huge_mnt;
 	struct file *filp;
 	const vma_flags_t flags = mk_vma_flags(VMA_NORESERVE_BIT);
+	int ret;
 
-	drm_gem_private_object_init(dev, obj, size);
+	ret = drm_gem_private_object_init(dev, obj, size);
+	if (ret)
+		return ret;
 
 	huge_mnt = drm_gem_get_huge_mnt(dev);
 	if (huge_mnt)
@@ -215,11 +218,15 @@ EXPORT_SYMBOL(drm_gem_object_init);
  * Initialize an already allocated GEM object of the specified size with
  * no GEM provided backing store. Instead the caller is responsible for
  * backing the object and handling it.
+ *
+ * Returns:
+ * 0 on success, or a negative error code on failure.
  */
-void drm_gem_private_object_init(struct drm_device *dev,
-				 struct drm_gem_object *obj, size_t size)
+int drm_gem_private_object_init(struct drm_device *dev,
+				struct drm_gem_object *obj, size_t size)
 {
-	BUG_ON((size & (PAGE_SIZE - 1)) != 0);
+	if ((size & (PAGE_SIZE - 1)) != 0)
+		return -EINVAL;
 
 	obj->dev = dev;
 	obj->filp = NULL;
@@ -236,6 +243,8 @@ void drm_gem_private_object_init(struct drm_device *dev,
 
 	drm_vma_node_reset(&obj->vma_node);
 	INIT_LIST_HEAD(&obj->lru_node);
+
+	return 0;
 }
 EXPORT_SYMBOL(drm_gem_private_object_init);
 
diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c b/drivers/gpu/drm/drm_gem_dma_helper.c
index 1c00a71ab3c9..fa354a36640b 100644
--- a/drivers/gpu/drm/drm_gem_dma_helper.c
+++ b/drivers/gpu/drm/drm_gem_dma_helper.c
@@ -92,7 +92,7 @@ __drm_gem_dma_create(struct drm_device *drm, size_t size, bool private)
 		gem_obj->funcs = &drm_gem_dma_default_funcs;
 
 	if (private) {
-		drm_gem_private_object_init(drm, gem_obj, size);
+		ret = drm_gem_private_object_init(drm, gem_obj, size);
 
 		/* Always use writecombine for dma-buf mappings */
 		dma_obj->map_noncoherent = false;
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 76a8d7f252e0..9f910b0ed0b0 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -61,7 +61,7 @@ static int __drm_gem_shmem_init(struct drm_device *dev, struct drm_gem_shmem_obj
 		obj->funcs = &drm_gem_shmem_funcs;
 
 	if (private) {
-		drm_gem_private_object_init(dev, obj, size);
+		ret = drm_gem_private_object_init(dev, obj, size);
 		shmem->map_wc = false; /* dma-buf mappings use always writecombine */
 	} else {
 		ret = drm_gem_object_init(dev, obj, size);
diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
index d1c80ad3dead..ac1be020c6df 100644
--- a/drivers/gpu/drm/drm_gpuvm.c
+++ b/drivers/gpu/drm/drm_gpuvm.c
@@ -1060,13 +1060,18 @@ struct drm_gem_object *
 drm_gpuvm_resv_object_alloc(struct drm_device *drm)
 {
 	struct drm_gem_object *obj;
+	int ret;
 
 	obj = kzalloc_obj(*obj);
 	if (!obj)
 		return NULL;
 
 	obj->funcs = &drm_gpuvm_object_funcs;
-	drm_gem_private_object_init(drm, obj, 0);
+	ret = drm_gem_private_object_init(drm, obj, 0);
+	if (ret) {
+		kfree(obj);
+		return NULL;
+	}
 
 	return obj;
 }
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index b0436a1e103f..94fa4d49f3fc 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -656,7 +656,11 @@ int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
 	if (ret)
 		return ret;
 
-	drm_gem_private_object_init(dev, obj, size);
+	ret = drm_gem_private_object_init(dev, obj, size);
+	if (ret) {
+		kfree(to_etnaviv_bo(obj));
+		return ret;
+	}
 
 	*res = to_etnaviv_bo(obj);
 
diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c
index 88f1e86c8903..11d0bb01f005 100644
--- a/drivers/gpu/drm/gma500/gem.c
+++ b/drivers/gpu/drm/gma500/gem.c
@@ -168,7 +168,9 @@ psb_gem_create(struct drm_device *dev, u64 size, const char *name, bool stolen,
 	obj->funcs = &psb_gem_object_funcs;
 
 	if (stolen) {
-		drm_gem_private_object_init(dev, obj, size);
+		ret = drm_gem_private_object_init(dev, obj, size);
+		if (ret)
+			goto err_release_resource;
 	} else {
 		ret = drm_gem_object_init(dev, obj, size);
 		if (ret)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index c824606497d2..65ce865a80e2 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -316,7 +316,10 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
 		goto fail_detach;
 	}
 
-	drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
+	ret = drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
+	if (ret)
+		goto fail_free_obj;
+
 	i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class,
 			     I915_BO_ALLOC_USER);
 	obj->base.import_attach = attach;
@@ -334,6 +337,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
 
 	return &obj->base;
 
+fail_free_obj:
+	i915_gem_object_free(obj);
 fail_detach:
 	dma_buf_detach(dma_buf, attach);
 	dma_buf_put(dma_buf);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_internal.c b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
index 37d286ecb99b..191d63aaf0a9 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_internal.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
@@ -142,6 +142,7 @@ __i915_gem_object_create_internal(struct drm_i915_private *i915,
 	static struct lock_class_key lock_class;
 	struct drm_i915_gem_object *obj;
 	unsigned int cache_level;
+	int ret;
 
 	GEM_BUG_ON(!size);
 	GEM_BUG_ON(!IS_ALIGNED(size, PAGE_SIZE));
@@ -153,7 +154,12 @@ __i915_gem_object_create_internal(struct drm_i915_private *i915,
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (ret) {
+		i915_gem_object_free(obj);
+		return ERR_PTR(ret);
+	}
+
 	i915_gem_object_init(obj, ops, &lock_class, 0);
 	obj->mem_flags |= I915_BO_FLAG_STRUCT_PAGE;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index 06543ae60706..d1a6d72c57ec 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -508,8 +508,11 @@ static int __create_shmem(struct drm_i915_private *i915,
 	const vma_flags_t shmem_flags = mk_vma_flags(VMA_NORESERVE_BIT);
 	struct vfsmount *huge_mnt;
 	struct file *filp;
+	int ret;
 
-	drm_gem_private_object_init(&i915->drm, obj, size);
+	ret = drm_gem_private_object_init(&i915->drm, obj, size);
+	if (ret)
+		return ret;
 
 	/* XXX: The __shmem_file_setup() function returns -EINVAL if size is
 	 * greater than MAX_LFS_FILESIZE.
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index 1cfdcf5c1118..e39e82ec9237 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -737,7 +737,10 @@ static int __i915_gem_object_create_stolen(struct intel_memory_region *mem,
 	 */
 	flags = I915_BO_ALLOC_CONTIGUOUS;
 
-	drm_gem_private_object_init(&mem->i915->drm, &obj->base, stolen->size);
+	err = drm_gem_private_object_init(&mem->i915->drm, &obj->base, stolen->size);
+	if (err)
+		return err;
+
 	i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class, flags);
 
 	obj->stolen = stolen;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
index df3fcc2b1248..ae7394be54a0 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
@@ -1301,7 +1301,10 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem,
 	enum ttm_bo_type bo_type;
 	int ret;
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (ret)
+		return ret;
+
 	i915_gem_object_init(obj, &i915_gem_ttm_obj_ops, &lock_class, flags);
 
 	obj->bo_offset = offset;
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
index 043095f93ac6..1a2f9a058d55 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
@@ -521,7 +521,12 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
 	if (obj == NULL)
 		return -ENOMEM;
 
-	drm_gem_private_object_init(dev, &obj->base, args->user_size);
+	ret = drm_gem_private_object_init(dev, &obj->base, args->user_size);
+	if (ret) {
+		i915_gem_object_free(obj);
+		return ret;
+	}
+
 	i915_gem_object_init(obj, &i915_gem_userptr_ops, &lock_class,
 			     I915_BO_ALLOC_USER);
 	obj->mem_flags = I915_BO_FLAG_STRUCT_PAGE;
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
index 8caaf325e56a..fdc0186e8045 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
@@ -105,6 +105,7 @@ huge_gem_object(struct drm_i915_private *i915,
 	static struct lock_class_key lock_class;
 	struct drm_i915_gem_object *obj;
 	unsigned int cache_level;
+	int ret;
 
 	GEM_BUG_ON(!phys_size || phys_size > dma_size);
 	GEM_BUG_ON(!IS_ALIGNED(phys_size, PAGE_SIZE));
@@ -117,7 +118,12 @@ huge_gem_object(struct drm_i915_private *i915,
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, dma_size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, dma_size);
+	if (ret) {
+		i915_gem_object_free(obj);
+		return ERR_PTR(ret);
+	}
+
 	i915_gem_object_init(obj, &huge_ops, &lock_class, 0);
 	obj->mem_flags |= I915_BO_FLAG_STRUCT_PAGE;
 
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index 44718e728291..a76f38ae9335 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -178,6 +178,7 @@ huge_pages_object(struct drm_i915_private *i915,
 	static struct lock_class_key lock_class;
 	struct drm_i915_gem_object *obj;
 	unsigned int cache_level;
+	int ret;
 
 	GEM_BUG_ON(!size);
 	GEM_BUG_ON(!IS_ALIGNED(size, BIT(__ffs(page_mask))));
@@ -192,7 +193,12 @@ huge_pages_object(struct drm_i915_private *i915,
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (ret) {
+		i915_gem_object_free(obj);
+		return ERR_PTR(ret);
+	}
+
 	i915_gem_object_init(obj, &huge_page_ops, &lock_class, 0);
 	obj->mem_flags |= I915_BO_FLAG_STRUCT_PAGE;
 	i915_gem_object_set_volatile(obj);
@@ -329,6 +335,7 @@ fake_huge_pages_object(struct drm_i915_private *i915, u64 size, bool single)
 {
 	static struct lock_class_key lock_class;
 	struct drm_i915_gem_object *obj;
+	int ret;
 
 	GEM_BUG_ON(!size);
 	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
@@ -343,7 +350,11 @@ fake_huge_pages_object(struct drm_i915_private *i915, u64 size, bool single)
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (ret) {
+		i915_gem_object_free(obj);
+		return ERR_PTR(ret);
+	}
 
 	if (single)
 		i915_gem_object_init(obj, &fake_ops_single, &lock_class, 0);
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c
index 8a1d6c5636c2..5b198162c588 100644
--- a/drivers/gpu/drm/i915/gvt/dmabuf.c
+++ b/drivers/gpu/drm/i915/gvt/dmabuf.c
@@ -202,13 +202,19 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
 	static struct lock_class_key lock_class;
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	struct drm_i915_gem_object *obj;
+	int ret;
 
 	obj = i915_gem_object_alloc();
 	if (obj == NULL)
 		return NULL;
 
-	drm_gem_private_object_init(dev, &obj->base,
+	ret = drm_gem_private_object_init(dev, &obj->base,
 		roundup(info->size, PAGE_SIZE));
+	if (ret) {
+		i915_gem_object_free(obj);
+		return NULL;
+	}
+
 	i915_gem_object_init(obj, &intel_vgpu_gem_ops, &lock_class, 0);
 	i915_gem_object_set_readonly(obj);
 
diff --git a/drivers/gpu/drm/i915/intel_gvt.c b/drivers/gpu/drm/i915/intel_gvt.c
index 6b43713899b8..21d3d133b147 100644
--- a/drivers/gpu/drm/i915/intel_gvt.c
+++ b/drivers/gpu/drm/i915/intel_gvt.c
@@ -287,6 +287,7 @@ void intel_gvt_resume(struct drm_i915_private *dev_priv)
  * actually enabled.
  */
 EXPORT_SYMBOL_NS_GPL(i915_gem_object_alloc, "I915_GVT");
+EXPORT_SYMBOL_NS_GPL(i915_gem_object_free, "I915_GVT");
 EXPORT_SYMBOL_NS_GPL(i915_gem_object_create_shmem, "I915_GVT");
 EXPORT_SYMBOL_NS_GPL(i915_gem_object_init, "I915_GVT");
 EXPORT_SYMBOL_NS_GPL(i915_gem_object_ggtt_pin_ww, "I915_GVT");
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index e6bd06774816..7eb254a0be57 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -128,7 +128,11 @@ fake_dma_object(struct drm_i915_private *i915, u64 size)
 	if (!obj)
 		goto err;
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (drm_gem_private_object_init(&i915->drm, &obj->base, size)) {
+		i915_gem_object_free(obj);
+		goto err;
+	}
+
 	i915_gem_object_init(obj, &fake_ops, &lock_class, 0);
 
 	i915_gem_object_set_volatile(obj);
diff --git a/drivers/gpu/drm/i915/selftests/mock_region.c b/drivers/gpu/drm/i915/selftests/mock_region.c
index 6324eb32d4dd..8bee0df1def9 100644
--- a/drivers/gpu/drm/i915/selftests/mock_region.c
+++ b/drivers/gpu/drm/i915/selftests/mock_region.c
@@ -66,11 +66,15 @@ static int mock_object_init(struct intel_memory_region *mem,
 {
 	static struct lock_class_key lock_class;
 	struct drm_i915_private *i915 = mem->i915;
+	int ret;
 
 	if (size > resource_size(&mem->region))
 		return -E2BIG;
 
-	drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	ret = drm_gem_private_object_init(&i915->drm, &obj->base, size);
+	if (ret)
+		return ret;
+
 	i915_gem_object_init(obj, &mock_region_obj_ops, &lock_class, flags);
 
 	obj->bo_offset = offset;
diff --git a/drivers/gpu/drm/imagination/pvr_vm.c b/drivers/gpu/drm/imagination/pvr_vm.c
index 396d349fb6ce..a3bc64e56728 100644
--- a/drivers/gpu/drm/imagination/pvr_vm.c
+++ b/drivers/gpu/drm/imagination/pvr_vm.c
@@ -585,7 +585,10 @@ pvr_vm_create_context(struct pvr_device *pvr_dev, bool is_userspace_context)
 			goto err_page_table_destroy;
 	}
 
-	drm_gem_private_object_init(&pvr_dev->base, &vm_ctx->dummy_gem, 0);
+	err = drm_gem_private_object_init(&pvr_dev->base, &vm_ctx->dummy_gem, 0);
+	if (err)
+		goto err_fw_object_destroy;
+
 	drm_gpuvm_init(&vm_ctx->gpuvm_mgr,
 		       is_userspace_context ? "PowerVR-user-VM" : "PowerVR-FW-VM",
 		       0, &pvr_dev->base, &vm_ctx->dummy_gem,
@@ -596,6 +599,9 @@ pvr_vm_create_context(struct pvr_device *pvr_dev, bool is_userspace_context)
 
 	return vm_ctx;
 
+err_fw_object_destroy:
+	if (is_userspace_context)
+		pvr_fw_object_destroy(vm_ctx->fw_mem_ctx_obj);
 err_page_table_destroy:
 	pvr_mmu_context_destroy(vm_ctx->mmu_ctx);
 
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 81ebb1e1094c..c3e95194b24f 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -1296,7 +1296,11 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
 	if (ret)
 		return ERR_PTR(ret);
 
-	drm_gem_private_object_init(dev, obj, size);
+	ret = drm_gem_private_object_init(dev, obj, size);
+	if (ret) {
+		kfree(to_msm_bo(obj));
+		return ERR_PTR(ret);
+	}
 
 	npages = size / PAGE_SIZE;
 
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index 8e013e4f2c6b..364d29686c46 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -1348,7 +1348,9 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
 
 	/* Initialize the GEM object. */
 	if (!(flags & OMAP_BO_MEM_SHMEM)) {
-		drm_gem_private_object_init(dev, obj, size);
+		ret = drm_gem_private_object_init(dev, obj, size);
+		if (ret)
+			goto err_free;
 	} else {
 		ret = drm_gem_object_init(dev, obj, size);
 		if (ret)
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
index 2de24f1b6018..cb3935ace1e6 100644
--- a/drivers/gpu/drm/panthor/panthor_gem.c
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
@@ -1047,7 +1047,11 @@ panthor_gem_prime_import_sg_table(struct drm_device *dev,
 	if (IS_ERR(bo))
 		return ERR_CAST(bo);
 
-	drm_gem_private_object_init(dev, &bo->base, attach->dmabuf->size);
+	ret = drm_gem_private_object_init(dev, &bo->base, attach->dmabuf->size);
+	if (ret) {
+		kfree(bo);
+		return ERR_PTR(ret);
+	}
 
 	ret = drm_gem_create_mmap_offset(&bo->base);
 	if (ret)
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index a0fc0801abb0..c7557c39ead0 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -150,7 +150,11 @@ int radeon_bo_create(struct radeon_device *rdev,
 	bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
 	if (bo == NULL)
 		return -ENOMEM;
-	drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size);
+	r = drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size);
+	if (r) {
+		kfree(bo);
+		return r;
+	}
 	bo->tbo.base.funcs = &radeon_gem_object_funcs;
 	bo->rdev = rdev;
 	bo->surface_reg = -1;
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
index 9228a7ad0dfa..977ceb4462bd 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c
@@ -389,7 +389,11 @@ struct drm_gem_object *rcar_du_gem_prime_import_sg_table(struct drm_device *dev,
 	gem_obj = &dma_obj->base;
 	gem_obj->funcs = &rcar_du_gem_funcs;
 
-	drm_gem_private_object_init(dev, gem_obj, attach->dmabuf->size);
+	ret = drm_gem_private_object_init(dev, gem_obj, attach->dmabuf->size);
+	if (ret) {
+		kfree(dma_obj);
+		return ERR_PTR(ret);
+	}
 	dma_obj->map_noncoherent = false;
 
 	ret = drm_gem_create_mmap_offset(gem_obj);
diff --git a/drivers/gpu/drm/tests/drm_exec_test.c b/drivers/gpu/drm/tests/drm_exec_test.c
index 2fc47f3b463b..b4427484da26 100644
--- a/drivers/gpu/drm/tests/drm_exec_test.c
+++ b/drivers/gpu/drm/tests/drm_exec_test.c
@@ -56,7 +56,8 @@ static void test_lock(struct kunit *test)
 	struct drm_exec exec;
 	int ret;
 
-	drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	ret = drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
 	drm_exec_until_all_locked(&exec) {
@@ -76,7 +77,8 @@ static void test_lock_unlock(struct kunit *test)
 	struct drm_exec exec;
 	int ret;
 
-	drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	ret = drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
 	drm_exec_until_all_locked(&exec) {
@@ -103,7 +105,8 @@ static void test_duplicates(struct kunit *test)
 	struct drm_exec exec;
 	int ret;
 
-	drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	ret = drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, 0);
 	drm_exec_until_all_locked(&exec) {
@@ -130,7 +133,8 @@ static void test_prepare(struct kunit *test)
 	struct drm_exec exec;
 	int ret;
 
-	drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	ret = drm_gem_private_object_init(priv->drm, &gobj, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
 	drm_exec_until_all_locked(&exec) {
@@ -162,8 +166,10 @@ static void test_prepare_array(struct kunit *test)
 		return;
 	}
 
-	drm_gem_private_object_init(priv->drm, gobj1, PAGE_SIZE);
-	drm_gem_private_object_init(priv->drm, gobj2, PAGE_SIZE);
+	ret = drm_gem_private_object_init(priv->drm, gobj1, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+	ret = drm_gem_private_object_init(priv->drm, gobj2, PAGE_SIZE);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
 	drm_exec_until_all_locked(&exec)
diff --git a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
index 56ad8ef32584..bb430763e7a5 100644
--- a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
+++ b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
@@ -119,7 +119,8 @@ static void ttm_bo_init_reserved_sys_man(struct kunit *test)
 	place = ttm_place_kunit_init(test, TTM_PL_SYSTEM, 0);
 	placement = ttm_placement_kunit_init(test, place, 1);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement,
 				   PAGE_SIZE, &ctx, NULL, NULL,
@@ -168,7 +169,8 @@ static void ttm_bo_init_reserved_mock_man(struct kunit *test)
 	place = ttm_place_kunit_init(test, mem_type, 0);
 	placement = ttm_placement_kunit_init(test, place, 1);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement,
 				   PAGE_SIZE, &ctx, NULL, NULL,
@@ -208,7 +210,8 @@ static void ttm_bo_init_reserved_resv(struct kunit *test)
 	place = ttm_place_kunit_init(test, TTM_PL_SYSTEM, 0);
 	placement = ttm_placement_kunit_init(test, place, 1);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	dma_resv_init(&resv);
 	dma_resv_lock(&resv, NULL);
 
@@ -244,7 +247,8 @@ static void ttm_bo_validate_basic(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, params->bo_type,
 				   fst_placement, PAGE_SIZE, &ctx_init, NULL,
@@ -390,7 +394,8 @@ static void ttm_bo_validate_same_placement(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, params->bo_type,
 				   placement, PAGE_SIZE, &ctx_init, NULL,
@@ -431,7 +436,8 @@ static void ttm_bo_validate_busy_placement(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement_init,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
@@ -478,7 +484,8 @@ static void ttm_bo_validate_multihop(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, params->bo_type,
 				   placement_init, PAGE_SIZE, &ctx_init, NULL,
@@ -717,7 +724,8 @@ static void ttm_bo_validate_move_fence_not_signaled(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement_init,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
@@ -782,7 +790,8 @@ static void ttm_bo_validate_swapout(struct kunit *test)
 	bo = kunit_kzalloc(test, sizeof(*bo), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo);
 
-	drm_gem_private_object_init(priv->drm, &bo->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -826,7 +835,8 @@ static void ttm_bo_validate_happy_evict(struct kunit *test)
 
 	memset(bos, 0, sizeof(*bos) * bo_no);
 	for (i = 0; i < bo_no; i++) {
-		drm_gem_private_object_init(priv->drm, &bos[i].base, bo_sizes[i]);
+		err = drm_gem_private_object_init(priv->drm, &bos[i].base, bo_sizes[i]);
+		KUNIT_ASSERT_EQ(test, err, 0);
 		err = ttm_bo_init_reserved(priv->ttm_dev, &bos[i], bo_type, placement,
 					   PAGE_SIZE, &ctx_init, NULL, NULL,
 					   &dummy_ttm_bo_destroy);
@@ -875,7 +885,8 @@ static void ttm_bo_validate_all_pinned_evict(struct kunit *test)
 	bo_big = kunit_kzalloc(test, sizeof(*bo_big), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_big);
 
-	drm_gem_private_object_init(priv->drm, &bo_big->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo_big->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_big, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -926,7 +937,8 @@ static void ttm_bo_validate_allowed_only_evict(struct kunit *test)
 	bo_pinned = kunit_kzalloc(test, sizeof(*bo_pinned), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_pinned);
 
-	drm_gem_private_object_init(priv->drm, &bo_pinned->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo_pinned->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_pinned, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -937,7 +949,8 @@ static void ttm_bo_validate_allowed_only_evict(struct kunit *test)
 	bo_evictable = kunit_kzalloc(test, sizeof(*bo_evictable), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_evictable);
 
-	drm_gem_private_object_init(priv->drm, &bo_evictable->base, size);
+	err = drm_gem_private_object_init(priv->drm, &bo_evictable->base, size);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_evictable, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -991,7 +1004,8 @@ static void ttm_bo_validate_deleted_evict(struct kunit *test)
 	bo_big = kunit_kzalloc(test, sizeof(*bo_big), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_big);
 
-	drm_gem_private_object_init(priv->drm, &bo_big->base, big);
+	err = drm_gem_private_object_init(priv->drm, &bo_big->base, big);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_big, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -1048,7 +1062,8 @@ static void ttm_bo_validate_busy_domain_evict(struct kunit *test)
 	bo_init = kunit_kzalloc(test, sizeof(*bo_init), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_init);
 
-	drm_gem_private_object_init(priv->drm, &bo_init->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo_init->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_init, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -1092,7 +1107,8 @@ static void ttm_bo_validate_evict_gutting(struct kunit *test)
 	bo_evict = kunit_kzalloc(test, sizeof(*bo_evict), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_evict);
 
-	drm_gem_private_object_init(priv->drm, &bo_evict->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo_evict->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_evict, bo_type, placement,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
@@ -1143,14 +1159,16 @@ static void ttm_bo_validate_recrusive_evict(struct kunit *test)
 	bo_mock = kunit_kzalloc(test, sizeof(*bo_mock), GFP_KERNEL);
 	KUNIT_ASSERT_NOT_NULL(test, bo_mock);
 
-	drm_gem_private_object_init(priv->drm, &bo_tt->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo_tt->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_tt, bo_type, placement_tt,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
 	KUNIT_EXPECT_EQ(test, err, 0);
 	dma_resv_unlock(bo_tt->base.resv);
 
-	drm_gem_private_object_init(priv->drm, &bo_mock->base, MANAGER_SIZE);
+	err = drm_gem_private_object_init(priv->drm, &bo_mock->base, MANAGER_SIZE);
+	KUNIT_ASSERT_EQ(test, err, 0);
 	err = ttm_bo_init_reserved(priv->ttm_dev, bo_mock, bo_type, placement_mock,
 				   PAGE_SIZE, &ctx_init, NULL, NULL,
 				   &dummy_ttm_bo_destroy);
diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
index 79964b436243..752f2369d73b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_prime.c
+++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
@@ -363,7 +363,11 @@ struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
 	obj = &bo->base.base;
 	drm_gem_object_set_resv(obj, buf->resv);
 	obj->funcs = &virtgpu_gem_dma_buf_funcs;
-	drm_gem_private_object_init(dev, obj, buf->size);
+	ret = drm_gem_private_object_init(dev, obj, buf->size);
+	if (ret) {
+		kfree(bo);
+		return ERR_PTR(ret);
+	}
 
 	attach = dma_buf_dynamic_attach(buf, dev->dev,
 					&virtgpu_dma_buf_attach_ops, obj);
diff --git a/drivers/gpu/drm/virtio/virtgpu_vram.c b/drivers/gpu/drm/virtio/virtgpu_vram.c
index e2e799b42c61..eec843f6701f 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vram.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vram.c
@@ -211,7 +211,11 @@ int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
 	INIT_LIST_HEAD(&vram->base.restore_node);
 
 	params->size = PAGE_ALIGN(params->size);
-	drm_gem_private_object_init(vgdev->ddev, obj, params->size);
+	ret = drm_gem_private_object_init(vgdev->ddev, obj, params->size);
+	if (ret) {
+		kfree(vram);
+		return ret;
+	}
 
 	/* Create fake offset */
 	ret = drm_gem_create_mmap_offset(obj);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index 9c7a73c0b0dc..43cc91284ec2 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -426,7 +426,11 @@ static int vmw_bo_init(struct vmw_private *dev_priv,
 	atomic_set(&vmw_bo->map_count, 0);
 
 	params->size = ALIGN(params->size, PAGE_SIZE);
-	drm_gem_private_object_init(vdev, &vmw_bo->tbo.base, params->size);
+	ret = drm_gem_private_object_init(vdev, &vmw_bo->tbo.base, params->size);
+	if (ret) {
+		kfree(vmw_bo);
+		return ret;
+	}
 
 	vmw_bo_placement_set(vmw_bo, params->domain, params->busy_domain);
 	ret = ttm_bo_init_reserved(bdev, &vmw_bo->tbo, params->bo_type,
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 85e6d9a0f575..6df7ef07ec0b 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -2363,7 +2363,11 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo,
 	/* Initialize purge advisory state */
 	bo->purgeable.state = XE_MADV_PURGEABLE_WILLNEED;
 
-	drm_gem_private_object_init(&xe->drm, &bo->ttm.base, size);
+	err = drm_gem_private_object_init(&xe->drm, &bo->ttm.base, size);
+	if (err) {
+		xe_bo_free(bo);
+		return ERR_PTR(err);
+	}
 
 	if (resv) {
 		ctx.allow_res_evict = !(flags & XE_BO_FLAG_NO_RESV_EVICT);
diff --git a/drivers/gpu/drm/xe/xe_mmio_gem.c b/drivers/gpu/drm/xe/xe_mmio_gem.c
index 8c803ef233cc..c1fb4da22f03 100644
--- a/drivers/gpu/drm/xe/xe_mmio_gem.c
+++ b/drivers/gpu/drm/xe/xe_mmio_gem.c
@@ -86,7 +86,11 @@ struct xe_mmio_gem *xe_mmio_gem_create(struct xe_device *xe, struct drm_file *fi
 	base->funcs = &xe_mmio_gem_funcs;
 	obj->phys_addr = phys_addr;
 
-	drm_gem_private_object_init(&xe->drm, base, size);
+	err = drm_gem_private_object_init(&xe->drm, base, size);
+	if (err) {
+		kfree(obj);
+		return ERR_PTR(err);
+	}
 
 	err = drm_gem_create_mmap_offset(base);
 	if (err)
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index 09f5ec28218a..f889232e8525 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -526,8 +526,8 @@ 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);
-void drm_gem_private_object_init(struct drm_device *dev,
-				 struct drm_gem_object *obj, size_t size);
+int 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);
 struct dma_resv *drm_gem_object_set_resv(struct drm_gem_object *obj,
 					  struct dma_resv *resv);
-- 
2.43.0


  parent reply	other threads:[~2026-09-03 13:44 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 13:27 Refcounting dma_resv v3 Christian König
2026-09-03 13:27 ` [PATCH 01/11] drm/i915: fix incorrect RCU teardown order Christian König
2026-09-03 13:27 ` [PATCH 02/11] dma-buf: Add reference counting to dma_resv v2 Christian König
2026-09-03 13:27 ` [PATCH 03/11] dma-buf/tests: Convert st-dma-resv tests to use dma_resv_alloc v2 Christian König
2026-09-03 13:27 ` [PATCH 04/11] drm/gem: Add helper for drm_gem_object resv assignment v2 Christian König
2026-09-03 13:28 ` Christian König [this message]
2026-09-03 13:28 ` [PATCH 06/11] drm/mode_config: Use dma_resv_alloc for lockdep annotation Christian König
2026-09-03 13:28 ` [PATCH 07/11] drm/xe: " Christian König
2026-09-10  2:22   ` Matthew Brost
2026-09-03 13:28 ` [PATCH 08/11] drm/i915/gt: Use dma_resv_alloc for VM reservation objects v2 Christian König
2026-09-03 13:28 ` [PATCH 09/11] drm/ttm/tests: Use dma_resv_alloc in test files Christian König
2026-09-03 13:28 ` [PATCH 10/11] drm/gem: Use dynamic allocation for GEM object dma_resv Christian König
2026-09-10  3:02   ` Matthew Brost
2026-09-03 13:28 ` [PATCH 11/11] dma-buf: Inline dma_resv_init and remove allocated flag Christian König
2026-09-10  3:23   ` Matthew Brost
2026-09-03 15:10 ` ✗ Fi.CI.BUILD: failure for series starting with [01/11] drm/i915: fix incorrect RCU teardown order Patchwork
2026-09-03 19:38 ` Refcounting dma_resv v3 Matthew Brost

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260903134408.105317-6-christian.koenig@amd.com \
    --to=ckoenig.leichtzumerken@gmail.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=dakr@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=ecourtney@nvidia.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=matthew.brost@intel.com \
    --cc=nat@pixelcluster.dev \
    --cc=thomas.hellstrom@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.