drm/ttm: rename and cleanup ttm_bo_init
authorChristian König <christian.koenig@amd.com>
Fri, 18 Feb 2022 13:32:53 +0000 (14:32 +0100)
committerChristian König <christian.koenig@amd.com>
Mon, 11 Jul 2022 08:53:13 +0000 (10:53 +0200)
Rename ttm_bo_init 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>
Link: https://patchwork.freedesktop.org/patch/msgid/20220707102453.3633-2-christian.koenig@amd.com
Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/drm_gem_vram_helper.c
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/qxl/qxl_object.c
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
include/drm/ttm/ttm_bo_api.h

index 2c82b1d5a0d79f29f133d82cbdee1d22e2054c70..d9cfe259f2a952e108f021e6cc70df0078617871 100644 (file)
@@ -591,7 +591,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_reserved(&adev->mman.bdev, &bo->tbo, bp->type,
                                 &bo->placement, page_align, &ctx,  NULL,
                                 bp->resv, bp->destroy);
        if (unlikely(r != 0))
index d607043716d38b1f104e810bef3d9f5a788a0087..125160b534bef9b76f9ce1b8dead0cc2e297dac6 100644 (file)
@@ -226,9 +226,9 @@ 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);
+       ret = ttm_bo_init_validate(bdev, &gbo->bo, ttm_bo_type_device,
+                                  &gbo->placement, pg_align, false, NULL, NULL,
+                                  ttm_buffer_object_destroy);
        if (ret)
                return ERR_PTR(ret);
 
index 4c25d9b2f138e57a06d47df654d493f4b16356e9..70e2ed4e99df1a9a73c299a78b5ccf6aba42bb11 100644 (file)
@@ -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_reserved(&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);
index d0887438b07e9d47cfe8dd2acbd3a9d73c917efd..994879d9db74e36cf0011249239d6046ec820246 100644 (file)
@@ -309,9 +309,9 @@ 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(nvbo->bo.bdev, &nvbo->bo, size, type,
-                         &nvbo->placement, align >> PAGE_SHIFT, false, sg,
-                         robj, nouveau_bo_del_ttm);
+       ret = ttm_bo_init_validate(nvbo->bo.bdev, &nvbo->bo, type,
+                                  &nvbo->placement, align >> PAGE_SHIFT, false,
+                                  sg, robj, nouveau_bo_del_ttm);
        if (ret) {
                /* ttm will call nouveau_bo_del_ttm if it fails.. */
                return ret;
index b42a657e4c2ff231bf43609eeeba4da815a0595d..695d9308d1f08b8aa0bbfc518a63a696dcd995b1 100644 (file)
@@ -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_reserved(&qdev->mman.bdev, &bo->tbo, type,
                                 &bo->placement, 0, &ctx, NULL, NULL,
                                 &qxl_ttm_bo_destroy);
        if (unlikely(r != 0)) {
index 6c4a6802ca9680289259f8bee4d5f91aedfbd610..00c33b24d5d3498fdbcaa961f1d02d9fc5798794 100644 (file)
@@ -202,9 +202,9 @@ int radeon_bo_create(struct radeon_device *rdev,
        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_validate(&rdev->mman.bdev, &bo->tbo, type,
+                                &bo->placement, page_align, !kernel, sg, resv,
+                                &radeon_ttm_bo_destroy);
        up_read(&rdev->pm.mclk_lock);
        if (unlikely(r != 0)) {
                return r;
index 296af2b89951abdc4fd12a7769bba284551713af..dbd331939e6dc5674dc3d26fdbf08c9f8cbb2042 100644 (file)
@@ -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_reserved
+ *
+ * @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_reserved(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,50 +982,84 @@ 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);
 
-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 *))
+/**
+ * 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.
+ * @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, 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, 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);
+       ret = ttm_bo_init_reserved(bdev, bo, type, placement, alignment, &ctx,
+                                  sg, resv, destroy);
        if (ret)
                return ret;
 
@@ -1009,7 +1068,7 @@ int ttm_bo_init(struct ttm_device *bdev,
 
        return 0;
 }
-EXPORT_SYMBOL(ttm_bo_init);
+EXPORT_SYMBOL(ttm_bo_init_validate);
 
 /*
  * buffer object vm functions.
index 85a66014c2b6ca2f4354024cf0e674f8d1b4811d..eb2fd7694cd17d639335a557b3fcc8c8177adf1a 100644 (file)
@@ -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_reserved(&dev_priv->bdev, bo, ttm_bo_type_kernel,
+                                  placement, 0, &ctx, NULL, NULL,
+                                  vmw_bo_default_destroy);
        if (unlikely(ret))
                goto error_free;
 
@@ -512,10 +512,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_reserved(bdev, &vmw_bo->base, ttm_bo_type_device,
+                                  placement, 0, &ctx, NULL, NULL, bo_free);
        if (unlikely(ret)) {
                return ret;
        }
index 2d524f8b080284ab0c64a975c6f58fec91b561cb..44a538ee5e2a6ce1fb0cee59ea321b386363ab42 100644 (file)
@@ -317,93 +317,16 @@ 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_reserved(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 *));
+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, bool interruptible,
                         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