All of lore.kernel.org
 help / color / mirror / Atom feed
* Improve TTMs empty object handling
@ 2022-05-09 13:09 Christian König
  2022-05-09 13:09 ` [PATCH 01/11] drm/radeon: switch over to ttm_bo_init_reserved Christian König
                   ` (13 more replies)
  0 siblings, 14 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel

Hi everyone,

re-sending this because Daniel was requesting a background why this is
useful.

When TTM creates a buffer this object initially should not have any
backing store and there no resource object associated with it. The same
can happen when a driver requests that the backing store of an object is
destroyed without allocating a new one.

This is really useful during initial buffer creation as well as temporary
buffers and page tables which content doesn't need to be preserved when
they are evicted.

Currently TTM allocates dummy system resources for that because drivers
couldn't handle a NULL pointer there. Audit the drivers and then clean
up TTM to stop making those dummy allocations.

Please review and comment,
Christian.



^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 01/11] drm/radeon: switch over to ttm_bo_init_reserved
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 02/11] drm/nouveau: " Christian König
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Use the new interface instead.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 6c4a6802ca96..1d414ff4ab0c 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -133,9 +133,12 @@ int radeon_bo_create(struct radeon_device *rdev,
 		     struct dma_resv *resv,
 		     struct radeon_bo **bo_ptr)
 {
-	struct radeon_bo *bo;
-	enum ttm_bo_type type;
 	unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
+
+	/* Kernel allocation are uninterruptible */
+	struct ttm_operation_ctx ctx = { !kernel, false };
+	enum ttm_bo_type type;
+	struct radeon_bo *bo;
 	int r;
 
 	size = ALIGN(size, PAGE_SIZE);
@@ -200,11 +203,13 @@ int radeon_bo_create(struct radeon_device *rdev,
 #endif
 
 	radeon_ttm_placement_from_domain(bo, domain);
-	/* Kernel allocation are uninterruptible */
 	down_read(&rdev->pm.mclk_lock);
-	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
-			&bo->placement, page_align, !kernel, sg, resv,
-			&radeon_ttm_bo_destroy);
+	r = ttm_bo_init_reserved(&rdev->mman.bdev, &bo->tbo, size, type,
+				 &bo->placement, page_align, &ctx, sg, resv,
+				 &radeon_ttm_bo_destroy);
+        if (!r)
+		ttm_bo_unreserve(&bo->tbo);
+
 	up_read(&rdev->pm.mclk_lock);
 	if (unlikely(r != 0)) {
 		return r;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 02/11] drm/nouveau: switch over to ttm_bo_init_reserved
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
  2022-05-09 13:09 ` [PATCH 01/11] drm/radeon: switch over to ttm_bo_init_reserved Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 03/11] drm/vram-helper: " Christian König
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Use the new interface instead.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 05076e530e7d..858b9382036c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -302,19 +302,23 @@ nouveau_bo_init(struct nouveau_bo *nvbo, u64 size, int align, u32 domain,
 		struct sg_table *sg, struct dma_resv *robj)
 {
 	int type = sg ? ttm_bo_type_sg : ttm_bo_type_device;
+	struct ttm_operation_ctx ctx = { false, false };
 	int ret;
 
 	nouveau_bo_placement_set(nvbo, domain, 0);
 	INIT_LIST_HEAD(&nvbo->io_reserve_lru);
 
-	ret = ttm_bo_init(nvbo->bo.bdev, &nvbo->bo, size, type,
-			  &nvbo->placement, align >> PAGE_SHIFT, false, sg,
-			  robj, nouveau_bo_del_ttm);
+	ret = ttm_bo_init_reserved(nvbo->bo.bdev, &nvbo->bo, size, type,
+				   &nvbo->placement, align >> PAGE_SHIFT, &ctx,
+				   sg, robj, nouveau_bo_del_ttm);
 	if (ret) {
 		/* ttm will call nouveau_bo_del_ttm if it fails.. */
 		return ret;
 	}
 
+	if (!robj)
+		ttm_bo_unreserve(&nvbo->bo);
+
 	return 0;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 03/11] drm/vram-helper: switch over to ttm_bo_init_reserved
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
  2022-05-09 13:09 ` [PATCH 01/11] drm/radeon: switch over to ttm_bo_init_reserved Christian König
  2022-05-09 13:09 ` [PATCH 02/11] drm/nouveau: " Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 04/11] drm/ttm: move default BO destructor into VMWGFX Christian König
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Use the new interface instead.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/drm_gem_vram_helper.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
index 123045b58fec..7449cbc2f925 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -186,6 +186,7 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
 						size_t size,
 						unsigned long pg_align)
 {
+	struct ttm_operation_ctx ctx = { false, false };
 	struct drm_gem_vram_object *gbo;
 	struct drm_gem_object *gem;
 	struct drm_vram_mm *vmm = dev->vram_mm;
@@ -225,12 +226,13 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
 	 * A failing ttm_bo_init will call ttm_buffer_object_destroy
 	 * to release gbo->bo.base and kfree gbo.
 	 */
-	ret = ttm_bo_init(bdev, &gbo->bo, size, ttm_bo_type_device,
-			  &gbo->placement, pg_align, false, NULL, NULL,
-			  ttm_buffer_object_destroy);
-	if (ret)
+	ret = ttm_bo_init_reserved(bdev, &gbo->bo, size, ttm_bo_type_device,
+				   &gbo->placement, pg_align, &ctx, NULL, NULL,
+				   ttm_buffer_object_destroy);
+        if (ret)
 		return ERR_PTR(ret);
 
+	ttm_bo_unreserve(&gbo->bo);
 	return gbo;
 }
 EXPORT_SYMBOL(drm_gem_vram_create);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 04/11] drm/ttm: move default BO destructor into VMWGFX
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (2 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 03/11] drm/vram-helper: " Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 05/11] drm/ttm: drop ttm_bo_init Christian König
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

It's the only driver using this.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index 85a66014c2b6..c4f376d5e1d0 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -462,6 +462,9 @@ int vmw_bo_create(struct vmw_private *vmw,
 		return -ENOMEM;
 	}
 
+	if (!bo_free)
+		bo_free = vmw_bo_default_destroy;
+
 	ret = vmw_bo_init(vmw, *p_bo, size,
 			  placement, interruptible, pin,
 			  bo_free);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 05/11] drm/ttm: drop ttm_bo_init
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (3 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 04/11] drm/ttm: move default BO destructor into VMWGFX Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 06/11] drm/ttm: rename and cleanup ttm_bo_init_reserved Christian König
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Not used any more.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c | 26 ---------------------
 include/drm/ttm/ttm_bo_api.h | 44 ------------------------------------
 2 files changed, 70 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 296af2b89951..e652055b5175 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -985,32 +985,6 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
 }
 EXPORT_SYMBOL(ttm_bo_init_reserved);
 
-int ttm_bo_init(struct ttm_device *bdev,
-		struct ttm_buffer_object *bo,
-		size_t size,
-		enum ttm_bo_type type,
-		struct ttm_placement *placement,
-		uint32_t page_alignment,
-		bool interruptible,
-		struct sg_table *sg,
-		struct dma_resv *resv,
-		void (*destroy) (struct ttm_buffer_object *))
-{
-	struct ttm_operation_ctx ctx = { interruptible, false };
-	int ret;
-
-	ret = ttm_bo_init_reserved(bdev, bo, size, type, placement,
-				   page_alignment, &ctx, sg, resv, destroy);
-	if (ret)
-		return ret;
-
-	if (!resv)
-		ttm_bo_unreserve(bo);
-
-	return 0;
-}
-EXPORT_SYMBOL(ttm_bo_init);
-
 /*
  * buffer object vm functions.
  */
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 2d524f8b0802..29384e2cb704 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -361,50 +361,6 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
 			 struct sg_table *sg, struct dma_resv *resv,
 			 void (*destroy) (struct ttm_buffer_object *));
 
-/**
- * ttm_bo_init
- *
- * @bdev: Pointer to a ttm_device struct.
- * @bo: Pointer to a ttm_buffer_object to be initialized.
- * @size: Requested size of buffer object.
- * @type: Requested type of buffer object.
- * @placement: Initial placement for buffer object.
- * @page_alignment: Data alignment in pages.
- * @interruptible: If needing to sleep to wait for GPU resources,
- * sleep interruptible.
- * pinned in physical memory. If this behaviour is not desired, this member
- * holds a pointer to a persistent shmem object. Typically, this would
- * point to the shmem object backing a GEM object if TTM is used to back a
- * GEM user interface.
- * @sg: Scatter-gather table.
- * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
- * @destroy: Destroy function. Use NULL for kfree().
- *
- * This function initializes a pre-allocated struct ttm_buffer_object.
- * As this object may be part of a larger structure, this function,
- * together with the @destroy function,
- * enables driver-specific objects derived from a ttm_buffer_object.
- *
- * On successful return, the caller owns an object kref to @bo. The kref and
- * list_kref are usually set to 1, but note that in some situations, other
- * tasks may already be holding references to @bo as well.
- *
- * If a failure occurs, the function will call the @destroy function, or
- * kfree() if @destroy is NULL. Thus, after a failure, dereferencing @bo is
- * illegal and will likely cause memory corruption.
- *
- * Returns
- * -ENOMEM: Out of memory.
- * -EINVAL: Invalid placement flags.
- * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
- */
-int ttm_bo_init(struct ttm_device *bdev, struct ttm_buffer_object *bo,
-		size_t size, enum ttm_bo_type type,
-		struct ttm_placement *placement,
-		uint32_t page_alignment, bool interrubtible,
-		struct sg_table *sg, struct dma_resv *resv,
-		void (*destroy) (struct ttm_buffer_object *));
-
 /**
  * ttm_kmap_obj_virtual
  *
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 06/11] drm/ttm: rename and cleanup ttm_bo_init_reserved
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (4 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 05/11] drm/ttm: drop ttm_bo_init Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 07/11] drm/amdgpu: audit bo->resource usage Christian König
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Rename ttm_bo_init_reserved to ttm_bo_init_validate since that better
matches what the function is actually doing.

Remove the unused size parameter, move the function's kerneldoc to the
implementation and cleanup the whole error handling.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  2 +-
 drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  5 +-
 drivers/gpu/drm/nouveau/nouveau_bo.c       |  2 +-
 drivers/gpu/drm/qxl/qxl_object.c           |  2 +-
 drivers/gpu/drm/radeon/radeon_object.c     |  2 +-
 drivers/gpu/drm/ttm/ttm_bo.c               | 92 ++++++++++++++--------
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c         | 12 ++-
 include/drm/ttm/ttm_bo_api.h               | 44 +----------
 9 files changed, 75 insertions(+), 88 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 5444515c1476..116c8d31e646 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -590,7 +590,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
 	if (!bp->destroy)
 		bp->destroy = &amdgpu_bo_destroy;
 
-	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
+	r = ttm_bo_init_validate(&adev->mman.bdev, &bo->tbo, bp->type,
 				 &bo->placement, page_align, &ctx,  NULL,
 				 bp->resv, bp->destroy);
 	if (unlikely(r != 0))
diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
index 7449cbc2f925..73e91baccea0 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -226,7 +226,7 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
 	 * A failing ttm_bo_init will call ttm_buffer_object_destroy
 	 * to release gbo->bo.base and kfree gbo.
 	 */
-	ret = ttm_bo_init_reserved(bdev, &gbo->bo, size, ttm_bo_type_device,
+	ret = ttm_bo_init_validate(bdev, &gbo->bo, ttm_bo_type_device,
 				   &gbo->placement, pg_align, &ctx, NULL, NULL,
 				   ttm_buffer_object_destroy);
         if (ret)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
index 4c25d9b2f138..253188da91eb 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
@@ -1229,9 +1229,8 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem,
 	 * Similarly, in delayed_destroy, we can't call ttm_bo_put()
 	 * until successful initialization.
 	 */
-	ret = ttm_bo_init_reserved(&i915->bdev, i915_gem_to_ttm(obj), size,
-				   bo_type, &i915_sys_placement,
-				   page_size >> PAGE_SHIFT,
+	ret = ttm_bo_init_validate(&i915->bdev, i915_gem_to_ttm(obj), bo_type,
+				   &i915_sys_placement, page_size >> PAGE_SHIFT,
 				   &ctx, NULL, NULL, i915_ttm_bo_destroy);
 	if (ret)
 		return i915_ttm_err_to_gem(ret);
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 858b9382036c..666941804297 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -308,7 +308,7 @@ nouveau_bo_init(struct nouveau_bo *nvbo, u64 size, int align, u32 domain,
 	nouveau_bo_placement_set(nvbo, domain, 0);
 	INIT_LIST_HEAD(&nvbo->io_reserve_lru);
 
-	ret = ttm_bo_init_reserved(nvbo->bo.bdev, &nvbo->bo, size, type,
+	ret = ttm_bo_init_validate(nvbo->bo.bdev, &nvbo->bo, type,
 				   &nvbo->placement, align >> PAGE_SHIFT, &ctx,
 				   sg, robj, nouveau_bo_del_ttm);
 	if (ret) {
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
index b42a657e4c2f..da3f76f508ea 100644
--- a/drivers/gpu/drm/qxl/qxl_object.c
+++ b/drivers/gpu/drm/qxl/qxl_object.c
@@ -141,7 +141,7 @@ int qxl_bo_create(struct qxl_device *qdev, unsigned long size,
 	qxl_ttm_placement_from_domain(bo, domain);
 
 	bo->tbo.priority = priority;
-	r = ttm_bo_init_reserved(&qdev->mman.bdev, &bo->tbo, size, type,
+	r = ttm_bo_init_validate(&qdev->mman.bdev, &bo->tbo, type,
 				 &bo->placement, 0, &ctx, NULL, NULL,
 				 &qxl_ttm_bo_destroy);
 	if (unlikely(r != 0)) {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 1d414ff4ab0c..550ca056b3ac 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -204,7 +204,7 @@ int radeon_bo_create(struct radeon_device *rdev,
 
 	radeon_ttm_placement_from_domain(bo, domain);
 	down_read(&rdev->pm.mclk_lock);
-	r = ttm_bo_init_reserved(&rdev->mman.bdev, &bo->tbo, size, type,
+	r = ttm_bo_init_validate(&rdev->mman.bdev, &bo->tbo, type,
 				 &bo->placement, page_align, &ctx, sg, resv,
 				 &radeon_ttm_bo_destroy);
         if (!r)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index e652055b5175..2b01cb30694a 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -915,36 +915,61 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_bo_validate);
 
-int ttm_bo_init_reserved(struct ttm_device *bdev,
-			 struct ttm_buffer_object *bo,
-			 size_t size,
-			 enum ttm_bo_type type,
-			 struct ttm_placement *placement,
-			 uint32_t page_alignment,
-			 struct ttm_operation_ctx *ctx,
-			 struct sg_table *sg,
-			 struct dma_resv *resv,
+/**
+ * ttm_bo_init_validate
+ *
+ * @bdev: Pointer to a ttm_device struct.
+ * @bo: Pointer to a ttm_buffer_object to be initialized.
+ * @type: Requested type of buffer object.
+ * @placement: Initial placement for buffer object.
+ * @alignment: Data alignment in pages.
+ * @ctx: TTM operation context for memory allocation.
+ * @sg: Scatter-gather table.
+ * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
+ * @destroy: Destroy function. Use NULL for kfree().
+ *
+ * This function initializes a pre-allocated struct ttm_buffer_object.
+ * As this object may be part of a larger structure, this function,
+ * together with the @destroy function, enables driver-specific objects
+ * derived from a ttm_buffer_object.
+ *
+ * On successful return, the caller owns an object kref to @bo. The kref and
+ * list_kref are usually set to 1, but note that in some situations, other
+ * tasks may already be holding references to @bo as well.
+ * Furthermore, if resv == NULL, the buffer's reservation lock will be held,
+ * and it is the caller's responsibility to call ttm_bo_unreserve.
+ *
+ * If a failure occurs, the function will call the @destroy function. Thus,
+ * after a failure, dereferencing @bo is illegal and will likely cause memory
+ * corruption.
+ *
+ * Returns
+ * -ENOMEM: Out of memory.
+ * -EINVAL: Invalid placement flags.
+ * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
+ */
+int ttm_bo_init_validate(struct ttm_device *bdev, struct ttm_buffer_object *bo,
+			 enum ttm_bo_type type, struct ttm_placement *placement,
+			 uint32_t alignment, struct ttm_operation_ctx *ctx,
+			 struct sg_table *sg, struct dma_resv *resv,
 			 void (*destroy) (struct ttm_buffer_object *))
 {
 	static const struct ttm_place sys_mem = { .mem_type = TTM_PL_SYSTEM };
-	bool locked;
 	int ret;
 
-	bo->destroy = destroy;
 	kref_init(&bo->kref);
 	INIT_LIST_HEAD(&bo->ddestroy);
 	bo->bdev = bdev;
 	bo->type = type;
-	bo->page_alignment = page_alignment;
+	bo->page_alignment = alignment;
+	bo->destroy = destroy;
 	bo->pin_count = 0;
 	bo->sg = sg;
 	bo->bulk_move = NULL;
-	if (resv) {
+	if (resv)
 		bo->base.resv = resv;
-		dma_resv_assert_held(bo->base.resv);
-	} else {
+	else
 		bo->base.resv = &bo->base._resv;
-	}
 	atomic_inc(&ttm_glob.bo_count);
 
 	ret = ttm_resource_alloc(bo, &sys_mem, &bo->resource);
@@ -957,33 +982,36 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
 	 * For ttm_bo_type_device buffers, allocate
 	 * address space from the device.
 	 */
-	if (bo->type == ttm_bo_type_device ||
-	    bo->type == ttm_bo_type_sg)
+	if (bo->type == ttm_bo_type_device || bo->type == ttm_bo_type_sg) {
 		ret = drm_vma_offset_add(bdev->vma_manager, &bo->base.vma_node,
-					 bo->resource->num_pages);
+					 PFN_UP(bo->base.size));
+		if (ret)
+			goto err_put;
+	}
 
 	/* passed reservation objects should already be locked,
 	 * since otherwise lockdep will be angered in radeon.
 	 */
-	if (!resv) {
-		locked = dma_resv_trylock(bo->base.resv);
-		WARN_ON(!locked);
-	}
+	if (!resv)
+		WARN_ON(!dma_resv_trylock(bo->base.resv));
+	else
+		dma_resv_assert_held(resv);
 
-	if (likely(!ret))
-		ret = ttm_bo_validate(bo, placement, ctx);
+	ret = ttm_bo_validate(bo, placement, ctx);
+	if (unlikely(ret))
+		goto err_unlock;
 
-	if (unlikely(ret)) {
-		if (!resv)
-			ttm_bo_unreserve(bo);
+	return 0;
 
-		ttm_bo_put(bo);
-		return ret;
-	}
+err_unlock:
+	if (!resv)
+		dma_resv_unlock(bo->base.resv);
 
+err_put:
+	ttm_bo_put(bo);
 	return ret;
 }
-EXPORT_SYMBOL(ttm_bo_init_reserved);
+EXPORT_SYMBOL(ttm_bo_init_validate);
 
 /*
  * buffer object vm functions.
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index c4f376d5e1d0..2bda298e51f0 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -429,9 +429,9 @@ int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
 
 	drm_gem_private_object_init(vdev, &bo->base, size);
 
-	ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
-				   ttm_bo_type_kernel, placement, 0,
-				   &ctx, NULL, NULL, vmw_bo_default_destroy);
+	ret = ttm_bo_init_validate(&dev_priv->bdev, bo, ttm_bo_type_kernel,
+				   placement, 0, &ctx, NULL, NULL,
+				   vmw_bo_default_destroy);
 	if (unlikely(ret))
 		goto error_free;
 
@@ -515,10 +515,8 @@ int vmw_bo_init(struct vmw_private *dev_priv,
 	size = ALIGN(size, PAGE_SIZE);
 	drm_gem_private_object_init(vdev, &vmw_bo->base.base, size);
 
-	ret = ttm_bo_init_reserved(bdev, &vmw_bo->base, size,
-				   ttm_bo_type_device,
-				   placement,
-				   0, &ctx, NULL, NULL, bo_free);
+	ret = ttm_bo_init_validate(bdev, &vmw_bo->base, ttm_bo_type_device,
+				   placement, 0, &ctx, NULL, NULL, bo_free);
 	if (unlikely(ret)) {
 		return ret;
 	}
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 29384e2cb704..d3821a130d74 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -317,47 +317,9 @@ void ttm_bo_unlock_delayed_workqueue(struct ttm_device *bdev, int resched);
 bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
 			      const struct ttm_place *place);
 
-/**
- * ttm_bo_init_reserved
- *
- * @bdev: Pointer to a ttm_device struct.
- * @bo: Pointer to a ttm_buffer_object to be initialized.
- * @size: Requested size of buffer object.
- * @type: Requested type of buffer object.
- * @placement: Initial placement for buffer object.
- * @page_alignment: Data alignment in pages.
- * @ctx: TTM operation context for memory allocation.
- * @sg: Scatter-gather table.
- * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
- * @destroy: Destroy function. Use NULL for kfree().
- *
- * This function initializes a pre-allocated struct ttm_buffer_object.
- * As this object may be part of a larger structure, this function,
- * together with the @destroy function,
- * enables driver-specific objects derived from a ttm_buffer_object.
- *
- * On successful return, the caller owns an object kref to @bo. The kref and
- * list_kref are usually set to 1, but note that in some situations, other
- * tasks may already be holding references to @bo as well.
- * Furthermore, if resv == NULL, the buffer's reservation lock will be held,
- * and it is the caller's responsibility to call ttm_bo_unreserve.
- *
- * If a failure occurs, the function will call the @destroy function, or
- * kfree() if @destroy is NULL. Thus, after a failure, dereferencing @bo is
- * illegal and will likely cause memory corruption.
- *
- * Returns
- * -ENOMEM: Out of memory.
- * -EINVAL: Invalid placement flags.
- * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
- */
-
-int ttm_bo_init_reserved(struct ttm_device *bdev,
-			 struct ttm_buffer_object *bo,
-			 size_t size, enum ttm_bo_type type,
-			 struct ttm_placement *placement,
-			 uint32_t page_alignment,
-			 struct ttm_operation_ctx *ctx,
+int ttm_bo_init_validate(struct ttm_device *bdev, struct ttm_buffer_object *bo,
+			 enum ttm_bo_type type, struct ttm_placement *placement,
+			 uint32_t alignment, struct ttm_operation_ctx *ctx,
 			 struct sg_table *sg, struct dma_resv *resv,
 			 void (*destroy) (struct ttm_buffer_object *));
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 07/11] drm/amdgpu: audit bo->resource usage
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (5 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 06/11] drm/ttm: rename and cleanup ttm_bo_init_reserved Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 08/11] drm/nouveau: " Christian König
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Make sure we can at least move and release BOs without backing store.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c    | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 116c8d31e646..5cf3a58bc925 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -1302,7 +1302,7 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)
 	if (bo->base.resv == &bo->base._resv)
 		amdgpu_amdkfd_remove_fence_on_pt_pd_bos(abo);
 
-	if (bo->resource->mem_type != TTM_PL_VRAM ||
+	if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM ||
 	    !(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) ||
 	    adev->in_suspend || adev->shutdown)
 		return;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ec26edd4f4d8..b79c93812342 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -471,7 +471,8 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
 
 	adev = amdgpu_ttm_adev(bo->bdev);
 
-	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
+	if (!old_mem || (old_mem->mem_type == TTM_PL_SYSTEM &&
+			 bo->ttm == NULL)) {
 		ttm_bo_move_null(bo, new_mem);
 		goto out;
 	}
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 08/11] drm/nouveau: audit bo->resource usage
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (6 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 07/11] drm/amdgpu: audit bo->resource usage Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 09/11] drm/ttm: " Christian König
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Make sure we can at least move and release BOs without backing store.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 666941804297..fb903c62d322 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -1010,7 +1010,8 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
 	}
 
 	/* Fake bo copy. */
-	if (old_reg->mem_type == TTM_PL_SYSTEM && !bo->ttm) {
+	if (!old_reg || (old_reg->mem_type == TTM_PL_SYSTEM &&
+			 !bo->ttm)) {
 		ttm_bo_move_null(bo, new_reg);
 		goto out;
 	}
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 09/11] drm/ttm: audit bo->resource usage
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (7 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 08/11] drm/nouveau: " Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 10/11] drm/ttm: stop allocating dummy resources during BO creation Christian König
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

Allow BOs to exist without backing store.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 2b01cb30694a..a55564c8b57c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -117,12 +117,13 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 				  struct ttm_operation_ctx *ctx,
 				  struct ttm_place *hop)
 {
-	struct ttm_resource_manager *old_man, *new_man;
 	struct ttm_device *bdev = bo->bdev;
+	bool old_use_tt, new_use_tt;
 	int ret;
 
-	old_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	new_man = ttm_manager_type(bdev, mem->mem_type);
+	old_use_tt = bo->resource &&
+		ttm_manager_type(bdev, bo->resource->mem_type)->use_tt;
+	new_use_tt = ttm_manager_type(bdev, mem->mem_type)->use_tt;
 
 	ttm_bo_unmap_virtual(bo);
 
@@ -130,11 +131,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	 * Create and bind a ttm if required.
 	 */
 
-	if (new_man->use_tt) {
+	if (new_use_tt) {
 		/* Zero init the new TTM structure if the old location should
 		 * have used one as well.
 		 */
-		ret = ttm_tt_create(bo, old_man->use_tt);
+		ret = ttm_tt_create(bo, old_use_tt);
 		if (ret)
 			goto out_err;
 
@@ -160,8 +161,7 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	return 0;
 
 out_err:
-	new_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	if (!new_man->use_tt)
+	if (!old_use_tt)
 		ttm_bo_tt_destroy(bo);
 
 	return ret;
@@ -898,7 +898,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 	/*
 	 * Check whether we need to move buffer.
 	 */
-	if (!ttm_resource_compat(bo->resource, placement)) {
+	if (!bo->resource || !ttm_resource_compat(bo->resource, placement)) {
 		ret = ttm_bo_move_buffer(bo, placement, ctx);
 		if (ret)
 			return ret;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 10/11] drm/ttm: stop allocating dummy resources during BO creation
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (8 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 09/11] drm/ttm: " Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-09 13:09 ` [PATCH 11/11] drm/ttm: stop allocating a dummy resource for pipelined gutting Christian König
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

That should not be necessary any more when drivers should at least be
able to handle the move without a resource.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index a55564c8b57c..31aa4b040d1e 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -954,7 +954,6 @@ int ttm_bo_init_validate(struct ttm_device *bdev, struct ttm_buffer_object *bo,
 			 struct sg_table *sg, struct dma_resv *resv,
 			 void (*destroy) (struct ttm_buffer_object *))
 {
-	static const struct ttm_place sys_mem = { .mem_type = TTM_PL_SYSTEM };
 	int ret;
 
 	kref_init(&bo->kref);
@@ -972,12 +971,6 @@ int ttm_bo_init_validate(struct ttm_device *bdev, struct ttm_buffer_object *bo,
 		bo->base.resv = &bo->base._resv;
 	atomic_inc(&ttm_glob.bo_count);
 
-	ret = ttm_resource_alloc(bo, &sys_mem, &bo->resource);
-	if (unlikely(ret)) {
-		ttm_bo_put(bo);
-		return ret;
-	}
-
 	/*
 	 * For ttm_bo_type_device buffers, allocate
 	 * address space from the device.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 11/11] drm/ttm: stop allocating a dummy resource for pipelined gutting
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (9 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 10/11] drm/ttm: stop allocating dummy resources during BO creation Christian König
@ 2022-05-09 13:09 ` Christian König
  2022-05-11 19:49 ` Improve TTMs empty object handling Daniel Vetter
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-05-09 13:09 UTC (permalink / raw)
  To: bob.beckett, dri-devel, daniel; +Cc: Christian König

That should not be necessary any more when drivers should at least be
able to handle a move without a resource.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo_util.c | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 1cbfb00c1d65..585fc529cc75 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -600,16 +600,10 @@ EXPORT_SYMBOL(ttm_bo_move_sync_cleanup);
  */
 int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 {
-	static const struct ttm_place sys_mem = { .mem_type = TTM_PL_SYSTEM };
 	struct ttm_buffer_object *ghost;
-	struct ttm_resource *sys_res;
 	struct ttm_tt *ttm;
 	int ret;
 
-	ret = ttm_resource_alloc(bo, &sys_mem, &sys_res);
-	if (ret)
-		return ret;
-
 	/* If already idle, no need for ghost object dance. */
 	ret = ttm_bo_wait(bo, false, true);
 	if (ret != -EBUSY) {
@@ -617,14 +611,13 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 			/* See comment below about clearing. */
 			ret = ttm_tt_create(bo, true);
 			if (ret)
-				goto error_free_sys_mem;
+				return ret;
 		} else {
 			ttm_tt_unpopulate(bo->bdev, bo->ttm);
 			if (bo->type == ttm_bo_type_device)
 				ttm_tt_mark_for_clear(bo->ttm);
 		}
 		ttm_resource_free(bo, &bo->resource);
-		ttm_bo_assign_mem(bo, sys_res);
 		return 0;
 	}
 
@@ -641,7 +634,7 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 	ret = ttm_tt_create(bo, true);
 	swap(bo->ttm, ttm);
 	if (ret)
-		goto error_free_sys_mem;
+		return ret;
 
 	ret = ttm_buffer_object_transfer(bo, &ghost);
 	if (ret)
@@ -655,13 +648,9 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 	dma_resv_unlock(&ghost->base._resv);
 	ttm_bo_put(ghost);
 	bo->ttm = ttm;
-	ttm_bo_assign_mem(bo, sys_res);
 	return 0;
 
 error_destroy_tt:
 	ttm_tt_destroy(bo->bdev, ttm);
-
-error_free_sys_mem:
-	ttm_resource_free(bo, &sys_res);
 	return ret;
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: Improve TTMs empty object handling
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (10 preceding siblings ...)
  2022-05-09 13:09 ` [PATCH 11/11] drm/ttm: stop allocating a dummy resource for pipelined gutting Christian König
@ 2022-05-11 19:49 ` Daniel Vetter
  2022-05-13  3:43 ` Luben Tuikov
  2022-05-13  9:21 ` Matthew Auld
  13 siblings, 0 replies; 21+ messages in thread
From: Daniel Vetter @ 2022-05-11 19:49 UTC (permalink / raw)
  To: Christian König; +Cc: bob.beckett, dri-devel

On Mon, May 09, 2022 at 03:09:40PM +0200, Christian König wrote:
> Hi everyone,
> 
> re-sending this because Daniel was requesting a background why this is
> useful.

Thanks a lot for typing this up. To make sure this isn't lost, could you
add a patch to at least add this as a comment to
ttm_buffer_object.resource, ideally rolling out the kerneldoc scaffolding
for that file while at it and making it kerneldoc?

I think documenting that kind of why&how for key links like
ttm_bo->ttm_resource is really important.

> When TTM creates a buffer this object initially should not have any
> backing store and there no resource object associated with it. The same
> can happen when a driver requests that the backing store of an object is
> destroyed without allocating a new one.
> 
> This is really useful during initial buffer creation as well as temporary
> buffers and page tables which content doesn't need to be preserved when
> they are evicted.
> 
> Currently TTM allocates dummy system resources for that because drivers
> couldn't handle a NULL pointer there. Audit the drivers and then clean
> up TTM to stop making those dummy allocations.

Also I guess this is good prep work for going the other direction, i.e.
allowing more than one ttm_resource per ttm_bo? Or is that all mostly
orthogonal issues that bo:resource 1:N for N=0 has vs 1:N for N > 1?

> Please review and comment,

I'll ... try. But maybe call in some favours from other i915 ttm folks
because I'm just really bad at doing review timeline these days :-/
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Improve TTMs empty object handling
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (11 preceding siblings ...)
  2022-05-11 19:49 ` Improve TTMs empty object handling Daniel Vetter
@ 2022-05-13  3:43 ` Luben Tuikov
  2022-05-13  9:21 ` Matthew Auld
  13 siblings, 0 replies; 21+ messages in thread
From: Luben Tuikov @ 2022-05-13  3:43 UTC (permalink / raw)
  To: Christian König, bob.beckett, dri-devel, daniel

Patch set reviewed. Good stuff.

Acked-by: Luben Tuikov <luben.tuikov@amd.com>

Regards,
Luben

On 2022-05-09 09:09, Christian König wrote:
> Hi everyone,
> 
> re-sending this because Daniel was requesting a background why this is
> useful.
> 
> When TTM creates a buffer this object initially should not have any
> backing store and there no resource object associated with it. The same
> can happen when a driver requests that the backing store of an object is
> destroyed without allocating a new one.
> 
> This is really useful during initial buffer creation as well as temporary
> buffers and page tables which content doesn't need to be preserved when
> they are evicted.
> 
> Currently TTM allocates dummy system resources for that because drivers
> couldn't handle a NULL pointer there. Audit the drivers and then clean
> up TTM to stop making those dummy allocations.
> 
> Please review and comment,
> Christian.
> 
> 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Improve TTMs empty object handling
  2022-05-09 13:09 Improve TTMs empty object handling Christian König
                   ` (12 preceding siblings ...)
  2022-05-13  3:43 ` Luben Tuikov
@ 2022-05-13  9:21 ` Matthew Auld
  2022-05-13 13:03   ` Christian König
  13 siblings, 1 reply; 21+ messages in thread
From: Matthew Auld @ 2022-05-13  9:21 UTC (permalink / raw)
  To: Christian König; +Cc: Robert Beckett, ML dri-devel

On Mon, 9 May 2022 at 14:09, Christian König
<ckoenig.leichtzumerken@gmail.com> wrote:
>
> Hi everyone,
>
> re-sending this because Daniel was requesting a background why this is
> useful.
>
> When TTM creates a buffer this object initially should not have any
> backing store and there no resource object associated with it. The same
> can happen when a driver requests that the backing store of an object is
> destroyed without allocating a new one.
>
> This is really useful during initial buffer creation as well as temporary
> buffers and page tables which content doesn't need to be preserved when
> they are evicted.
>
> Currently TTM allocates dummy system resources for that because drivers
> couldn't handle a NULL pointer there. Audit the drivers and then clean
> up TTM to stop making those dummy allocations.
>
> Please review and comment,

Any chance we can throw this at intel-ci? Series seems to apply to drm-tip.

> Christian.
>
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Improve TTMs empty object handling
  2022-05-13  9:21 ` Matthew Auld
@ 2022-05-13 13:03   ` Christian König
  2022-05-13 13:27     ` Matthew Auld
  0 siblings, 1 reply; 21+ messages in thread
From: Christian König @ 2022-05-13 13:03 UTC (permalink / raw)
  To: Matthew Auld; +Cc: Robert Beckett, ML dri-devel

Am 13.05.22 um 11:21 schrieb Matthew Auld:
> On Mon, 9 May 2022 at 14:09, Christian König
> <ckoenig.leichtzumerken@gmail.com> wrote:
>> Hi everyone,
>>
>> re-sending this because Daniel was requesting a background why this is
>> useful.
>>
>> When TTM creates a buffer this object initially should not have any
>> backing store and there no resource object associated with it. The same
>> can happen when a driver requests that the backing store of an object is
>> destroyed without allocating a new one.
>>
>> This is really useful during initial buffer creation as well as temporary
>> buffers and page tables which content doesn't need to be preserved when
>> they are evicted.
>>
>> Currently TTM allocates dummy system resources for that because drivers
>> couldn't handle a NULL pointer there. Audit the drivers and then clean
>> up TTM to stop making those dummy allocations.
>>
>> Please review and comment,
> Any chance we can throw this at intel-ci? Series seems to apply to drm-tip.

It should be enough to CC intel-gfx@lists.freedesktop.org when sending 
the patch set out, right?

Christian.

>
>> Christian.
>>
>>


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Improve TTMs empty object handling
  2022-05-13 13:03   ` Christian König
@ 2022-05-13 13:27     ` Matthew Auld
  0 siblings, 0 replies; 21+ messages in thread
From: Matthew Auld @ 2022-05-13 13:27 UTC (permalink / raw)
  To: Christian König; +Cc: Robert Beckett, ML dri-devel

On Fri, 13 May 2022 at 14:03, Christian König
<ckoenig.leichtzumerken@gmail.com> wrote:
>
> Am 13.05.22 um 11:21 schrieb Matthew Auld:
> > On Mon, 9 May 2022 at 14:09, Christian König
> > <ckoenig.leichtzumerken@gmail.com> wrote:
> >> Hi everyone,
> >>
> >> re-sending this because Daniel was requesting a background why this is
> >> useful.
> >>
> >> When TTM creates a buffer this object initially should not have any
> >> backing store and there no resource object associated with it. The same
> >> can happen when a driver requests that the backing store of an object is
> >> destroyed without allocating a new one.
> >>
> >> This is really useful during initial buffer creation as well as temporary
> >> buffers and page tables which content doesn't need to be preserved when
> >> they are evicted.
> >>
> >> Currently TTM allocates dummy system resources for that because drivers
> >> couldn't handle a NULL pointer there. Audit the drivers and then clean
> >> up TTM to stop making those dummy allocations.
> >>
> >> Please review and comment,
> > Any chance we can throw this at intel-ci? Series seems to apply to drm-tip.
>
> It should be enough to CC intel-gfx@lists.freedesktop.org when sending
> the patch set out, right?

Yes, that should be enough.

>
> Christian.
>
> >
> >> Christian.
> >>
> >>
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 09/11] drm/ttm: audit bo->resource usage
@ 2022-05-19 19:19 kernel test robot
  0 siblings, 0 replies; 21+ messages in thread
From: kernel test robot @ 2022-05-19 19:19 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 4402 bytes --]

CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220519095508.115203-10-christian.koenig@amd.com>
References: <20220519095508.115203-10-christian.koenig@amd.com>
TO: "Christian König" <ckoenig.leichtzumerken@gmail.com>
TO: intel-gfx(a)lists.freedesktop.org
CC: matthew.william.auld(a)gmail.com
CC: "Christian König" <christian.koenig@amd.com>
CC: dri-devel(a)lists.freedesktop.org

Hi "Christian,

I love your patch! Perhaps something to improve:

[auto build test WARNING on drm-tip/drm-tip]
[cannot apply to drm/drm-next drm-intel/for-linux-next v5.18-rc7 next-20220519]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Christian-K-nig/drm-radeon-switch-over-to-ttm_bo_init_reserved/20220519-185504
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
:::::: branch date: 8 hours ago
:::::: commit date: 8 hours ago
config: i386-randconfig-m021 (https://download.01.org/0day-ci/archive/20220520/202205200316.Md7zjc9o-lkp(a)intel.com/config)
compiler: gcc-11 (Debian 11.3.0-1) 11.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/gpu/drm/ttm/ttm_bo.c:909 ttm_bo_validate() error: we previously assumed 'bo->resource' could be null (see line 901)

Old smatch warnings:
drivers/gpu/drm/ttm/ttm_bo.c:672 ttm_mem_evict_first() warn: inconsistent returns '&bdev->lru_lock'.
include/drm/drm_vma_manager.h:225 drm_vma_node_unmap() warn: should 'drm_vma_node_size(node) << 12' be a 64 bit type?

vim +909 drivers/gpu/drm/ttm/ttm_bo.c

ba4e7d973dd09b Thomas Hellstrom 2009-06-10  883  
09855acb1c2e37 Jerome Glisse    2009-12-10  884  int ttm_bo_validate(struct ttm_buffer_object *bo,
ca262a9998d461 Jerome Glisse    2009-12-08  885  		    struct ttm_placement *placement,
19be5570107108 Christian König  2017-04-12  886  		    struct ttm_operation_ctx *ctx)
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  887  {
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  888  	int ret;
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  889  
52791eeec1d9f4 Christian König  2019-08-11  890  	dma_resv_assert_held(bo->base.resv);
d2588d2ded0f3a Christian König  2018-03-15  891  
d2588d2ded0f3a Christian König  2018-03-15  892  	/*
d2588d2ded0f3a Christian König  2018-03-15  893  	 * Remove the backing store if no placement is given.
d2588d2ded0f3a Christian König  2018-03-15  894  	 */
a3be8cd70fec2a Thomas Hellström 2021-06-02  895  	if (!placement->num_placement && !placement->num_busy_placement)
a3be8cd70fec2a Thomas Hellström 2021-06-02  896  		return ttm_bo_pipeline_gutting(bo);
d2588d2ded0f3a Christian König  2018-03-15  897  
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  898  	/*
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  899  	 * Check whether we need to move buffer.
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  900  	 */
abd7815e9a77bc Christian König  2022-05-19 @901  	if (!bo->resource || !ttm_resource_compat(bo->resource, placement)) {
83876c1bed8c91 Christian König  2017-04-12  902  		ret = ttm_bo_move_buffer(bo, placement, ctx);
ca262a9998d461 Jerome Glisse    2009-12-08  903  		if (ret)
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  904  			return ret;
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  905  	}
62975d27d647a4 Christian König  2020-08-12  906  	/*
62975d27d647a4 Christian König  2020-08-12  907  	 * We might need to add a TTM.
62975d27d647a4 Christian König  2020-08-12  908  	 */
d3116756a710e3 Christian König  2021-04-12 @909  	if (bo->resource->mem_type == TTM_PL_SYSTEM) {
62975d27d647a4 Christian König  2020-08-12  910  		ret = ttm_tt_create(bo, true);
62975d27d647a4 Christian König  2020-08-12  911  		if (ret)
62975d27d647a4 Christian König  2020-08-12  912  			return ret;
62975d27d647a4 Christian König  2020-08-12  913  	}
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  914  	return 0;
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  915  }
09855acb1c2e37 Jerome Glisse    2009-12-10  916  EXPORT_SYMBOL(ttm_bo_validate);
ba4e7d973dd09b Thomas Hellstrom 2009-06-10  917  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 09/11] drm/ttm: audit bo->resource usage
  2022-05-19  9:55 ` [PATCH 09/11] drm/ttm: audit bo->resource usage Christian König
@ 2022-05-19 14:15   ` Ruhl, Michael J
  0 siblings, 0 replies; 21+ messages in thread
From: Ruhl, Michael J @ 2022-05-19 14:15 UTC (permalink / raw)
  To: Christian König, intel-gfx
  Cc: matthew.william.auld, Christian König, dri-devel

>-----Original Message-----
>From: dri-devel <dri-devel-bounces@lists.freedesktop.org> On Behalf Of
>Christian König
>Sent: Thursday, May 19, 2022 5:55 AM
>To: intel-gfx@lists.freedesktop.org
>Cc: matthew.william.auld@gmail.com; Christian König
><christian.koenig@amd.com>; dri-devel@lists.freedesktop.org
>Subject: [PATCH 09/11] drm/ttm: audit bo->resource usage
>
>Allow BOs to exist without backing store.

Took me a while to figure out that only the last line is related to this commit
message.

Could you add something like:

Refactor usage information.

Allow BOs to exist without backing store.

?

Would make this patch a little easier to decipher.

M

>Signed-off-by: Christian König <christian.koenig@amd.com>
>---
> drivers/gpu/drm/ttm/ttm_bo.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
>diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
>index 2b01cb30694a..a55564c8b57c 100644
>--- a/drivers/gpu/drm/ttm/ttm_bo.c
>+++ b/drivers/gpu/drm/ttm/ttm_bo.c
>@@ -117,12 +117,13 @@ static int ttm_bo_handle_move_mem(struct
>ttm_buffer_object *bo,
> 				  struct ttm_operation_ctx *ctx,
> 				  struct ttm_place *hop)
> {
>-	struct ttm_resource_manager *old_man, *new_man;
> 	struct ttm_device *bdev = bo->bdev;
>+	bool old_use_tt, new_use_tt;
> 	int ret;
>
>-	old_man = ttm_manager_type(bdev, bo->resource->mem_type);
>-	new_man = ttm_manager_type(bdev, mem->mem_type);
>+	old_use_tt = bo->resource &&
>+		ttm_manager_type(bdev, bo->resource->mem_type)-
>>use_tt;
>+	new_use_tt = ttm_manager_type(bdev, mem->mem_type)->use_tt;
>
> 	ttm_bo_unmap_virtual(bo);
>
>@@ -130,11 +131,11 @@ static int ttm_bo_handle_move_mem(struct
>ttm_buffer_object *bo,
> 	 * Create and bind a ttm if required.
> 	 */
>
>-	if (new_man->use_tt) {
>+	if (new_use_tt) {
> 		/* Zero init the new TTM structure if the old location should
> 		 * have used one as well.
> 		 */
>-		ret = ttm_tt_create(bo, old_man->use_tt);
>+		ret = ttm_tt_create(bo, old_use_tt);
> 		if (ret)
> 			goto out_err;
>
>@@ -160,8 +161,7 @@ static int ttm_bo_handle_move_mem(struct
>ttm_buffer_object *bo,
> 	return 0;
>
> out_err:
>-	new_man = ttm_manager_type(bdev, bo->resource->mem_type);
>-	if (!new_man->use_tt)
>+	if (!old_use_tt)
> 		ttm_bo_tt_destroy(bo);
>
> 	return ret;
>@@ -898,7 +898,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
> 	/*
> 	 * Check whether we need to move buffer.
> 	 */
>-	if (!ttm_resource_compat(bo->resource, placement)) {
>+	if (!bo->resource || !ttm_resource_compat(bo->resource,
>placement)) {
> 		ret = ttm_bo_move_buffer(bo, placement, ctx);
> 		if (ret)
> 			return ret;
>--
>2.25.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 09/11] drm/ttm: audit bo->resource usage
  2022-05-19  9:54 Christian König
@ 2022-05-19  9:55 ` Christian König
  2022-05-19 14:15   ` Ruhl, Michael J
  0 siblings, 1 reply; 21+ messages in thread
From: Christian König @ 2022-05-19  9:55 UTC (permalink / raw)
  To: intel-gfx; +Cc: matthew.william.auld, Christian König, dri-devel

Allow BOs to exist without backing store.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 2b01cb30694a..a55564c8b57c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -117,12 +117,13 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 				  struct ttm_operation_ctx *ctx,
 				  struct ttm_place *hop)
 {
-	struct ttm_resource_manager *old_man, *new_man;
 	struct ttm_device *bdev = bo->bdev;
+	bool old_use_tt, new_use_tt;
 	int ret;
 
-	old_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	new_man = ttm_manager_type(bdev, mem->mem_type);
+	old_use_tt = bo->resource &&
+		ttm_manager_type(bdev, bo->resource->mem_type)->use_tt;
+	new_use_tt = ttm_manager_type(bdev, mem->mem_type)->use_tt;
 
 	ttm_bo_unmap_virtual(bo);
 
@@ -130,11 +131,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	 * Create and bind a ttm if required.
 	 */
 
-	if (new_man->use_tt) {
+	if (new_use_tt) {
 		/* Zero init the new TTM structure if the old location should
 		 * have used one as well.
 		 */
-		ret = ttm_tt_create(bo, old_man->use_tt);
+		ret = ttm_tt_create(bo, old_use_tt);
 		if (ret)
 			goto out_err;
 
@@ -160,8 +161,7 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	return 0;
 
 out_err:
-	new_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	if (!new_man->use_tt)
+	if (!old_use_tt)
 		ttm_bo_tt_destroy(bo);
 
 	return ret;
@@ -898,7 +898,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 	/*
 	 * Check whether we need to move buffer.
 	 */
-	if (!ttm_resource_compat(bo->resource, placement)) {
+	if (!bo->resource || !ttm_resource_compat(bo->resource, placement)) {
 		ret = ttm_bo_move_buffer(bo, placement, ctx);
 		if (ret)
 			return ret;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 09/11] drm/ttm: audit bo->resource usage
  2022-03-29 11:02 Allow ttm_buffer_object without resource Christian König
@ 2022-03-29 11:02 ` Christian König
  0 siblings, 0 replies; 21+ messages in thread
From: Christian König @ 2022-03-29 11:02 UTC (permalink / raw)
  To: bob.beckett, dri-devel; +Cc: Christian König

Allow BOs to exist without backing store.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index b7e259245f82..bd001fdde9fb 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -117,12 +117,13 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 				  struct ttm_operation_ctx *ctx,
 				  struct ttm_place *hop)
 {
-	struct ttm_resource_manager *old_man, *new_man;
 	struct ttm_device *bdev = bo->bdev;
+	bool old_use_tt, new_use_tt;
 	int ret;
 
-	old_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	new_man = ttm_manager_type(bdev, mem->mem_type);
+	old_use_tt = bo->resource &&
+		ttm_manager_type(bdev, bo->resource->mem_type)->use_tt;
+	new_use_tt = ttm_manager_type(bdev, mem->mem_type)->use_tt;
 
 	ttm_bo_unmap_virtual(bo);
 
@@ -130,11 +131,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	 * Create and bind a ttm if required.
 	 */
 
-	if (new_man->use_tt) {
+	if (new_use_tt) {
 		/* Zero init the new TTM structure if the old location should
 		 * have used one as well.
 		 */
-		ret = ttm_tt_create(bo, old_man->use_tt);
+		ret = ttm_tt_create(bo, old_use_tt);
 		if (ret)
 			goto out_err;
 
@@ -156,8 +157,7 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
 	return 0;
 
 out_err:
-	new_man = ttm_manager_type(bdev, bo->resource->mem_type);
-	if (!new_man->use_tt)
+	if (!old_use_tt)
 		ttm_bo_tt_destroy(bo);
 
 	return ret;
@@ -900,7 +900,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
 	/*
 	 * Check whether we need to move buffer.
 	 */
-	if (!ttm_resource_compat(bo->resource, placement)) {
+	if (!bo->resource || !ttm_resource_compat(bo->resource, placement)) {
 		ret = ttm_bo_move_buffer(bo, placement, ctx);
 		if (ret)
 			return ret;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2022-05-19 19:19 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09 13:09 Improve TTMs empty object handling Christian König
2022-05-09 13:09 ` [PATCH 01/11] drm/radeon: switch over to ttm_bo_init_reserved Christian König
2022-05-09 13:09 ` [PATCH 02/11] drm/nouveau: " Christian König
2022-05-09 13:09 ` [PATCH 03/11] drm/vram-helper: " Christian König
2022-05-09 13:09 ` [PATCH 04/11] drm/ttm: move default BO destructor into VMWGFX Christian König
2022-05-09 13:09 ` [PATCH 05/11] drm/ttm: drop ttm_bo_init Christian König
2022-05-09 13:09 ` [PATCH 06/11] drm/ttm: rename and cleanup ttm_bo_init_reserved Christian König
2022-05-09 13:09 ` [PATCH 07/11] drm/amdgpu: audit bo->resource usage Christian König
2022-05-09 13:09 ` [PATCH 08/11] drm/nouveau: " Christian König
2022-05-09 13:09 ` [PATCH 09/11] drm/ttm: " Christian König
2022-05-09 13:09 ` [PATCH 10/11] drm/ttm: stop allocating dummy resources during BO creation Christian König
2022-05-09 13:09 ` [PATCH 11/11] drm/ttm: stop allocating a dummy resource for pipelined gutting Christian König
2022-05-11 19:49 ` Improve TTMs empty object handling Daniel Vetter
2022-05-13  3:43 ` Luben Tuikov
2022-05-13  9:21 ` Matthew Auld
2022-05-13 13:03   ` Christian König
2022-05-13 13:27     ` Matthew Auld
  -- strict thread matches above, loose matches on Subject: below --
2022-05-19 19:19 [PATCH 09/11] drm/ttm: audit bo->resource usage kernel test robot
2022-05-19  9:54 Christian König
2022-05-19  9:55 ` [PATCH 09/11] drm/ttm: audit bo->resource usage Christian König
2022-05-19 14:15   ` Ruhl, Michael J
2022-03-29 11:02 Allow ttm_buffer_object without resource Christian König
2022-03-29 11:02 ` [PATCH 09/11] drm/ttm: audit bo->resource usage Christian König

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.