From: Greg Kroah-Hartman Date: Mon, 13 May 2024 08:44:16 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v4.19.314~82 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c0a4980194fda6cbb99900e5471069a34c9f2d5b;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch --- diff --git a/queue-6.1/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch b/queue-6.1/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch new file mode 100644 index 00000000000..fb47f55cb0c --- /dev/null +++ b/queue-6.1/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch @@ -0,0 +1,195 @@ +From d3a9331a6591e9df64791e076f6591f440af51c3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= +Date: Thu, 21 Mar 2024 11:32:02 +0100 +Subject: drm/amdgpu: once more fix the call oder in amdgpu_ttm_move() v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Christian König + +commit d3a9331a6591e9df64791e076f6591f440af51c3 upstream. + +This reverts drm/amdgpu: fix ftrace event amdgpu_bo_move always move +on same heap. The basic problem here is that after the move the old +location is simply not available any more. + +Some fixes were suggested, but essentially we should call the move +notification before actually moving things because only this way we have +the correct order for DMA-buf and VM move notifications as well. + +Also rework the statistic handling so that we don't update the eviction +counter before the move. + +v2: add missing NULL check + +Signed-off-by: Christian König +Fixes: 94aeb4117343 ("drm/amdgpu: fix ftrace event amdgpu_bo_move always move on same heap") +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3171 +Reviewed-by: Alex Deucher +Signed-off-by: Alex Deucher +CC: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 14 +++++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 4 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 48 +++++++++++++++-------------- + 3 files changed, 38 insertions(+), 28 deletions(-) + +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +@@ -1222,14 +1222,18 @@ int amdgpu_bo_get_metadata(struct amdgpu + * amdgpu_bo_move_notify - notification about a memory move + * @bo: pointer to a buffer object + * @evict: if this move is evicting the buffer from the graphics address space ++ * @new_mem: new resource for backing the BO + * + * Marks the corresponding &amdgpu_bo buffer object as invalid, also performs + * bookkeeping. + * TTM driver callback which is called when ttm moves a buffer. + */ +-void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict) ++void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, ++ bool evict, ++ struct ttm_resource *new_mem) + { + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); ++ struct ttm_resource *old_mem = bo->resource; + struct amdgpu_bo *abo; + + if (!amdgpu_bo_is_amdgpu_bo(bo)) +@@ -1241,12 +1245,12 @@ void amdgpu_bo_move_notify(struct ttm_bu + amdgpu_bo_kunmap(abo); + + if (abo->tbo.base.dma_buf && !abo->tbo.base.import_attach && +- bo->resource->mem_type != TTM_PL_SYSTEM) ++ old_mem && old_mem->mem_type != TTM_PL_SYSTEM) + dma_buf_move_notify(abo->tbo.base.dma_buf); + +- /* remember the eviction */ +- if (evict) +- atomic64_inc(&adev->num_evictions); ++ /* move_notify is called before move happens */ ++ trace_amdgpu_bo_move(abo, new_mem ? new_mem->mem_type : -1, ++ old_mem ? old_mem->mem_type : -1); + } + + void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem, +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +@@ -312,7 +312,9 @@ int amdgpu_bo_set_metadata (struct amdgp + int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer, + size_t buffer_size, uint32_t *metadata_size, + uint64_t *flags); +-void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict); ++void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, ++ bool evict, ++ struct ttm_resource *new_mem); + void amdgpu_bo_release_notify(struct ttm_buffer_object *bo); + vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); + void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -483,14 +483,16 @@ static int amdgpu_bo_move(struct ttm_buf + + if (!old_mem || (old_mem->mem_type == TTM_PL_SYSTEM && + bo->ttm == NULL)) { ++ amdgpu_bo_move_notify(bo, evict, new_mem); + ttm_bo_move_null(bo, new_mem); +- goto out; ++ return 0; + } + if (old_mem->mem_type == TTM_PL_SYSTEM && + (new_mem->mem_type == TTM_PL_TT || + new_mem->mem_type == AMDGPU_PL_PREEMPT)) { ++ amdgpu_bo_move_notify(bo, evict, new_mem); + ttm_bo_move_null(bo, new_mem); +- goto out; ++ return 0; + } + if ((old_mem->mem_type == TTM_PL_TT || + old_mem->mem_type == AMDGPU_PL_PREEMPT) && +@@ -500,9 +502,10 @@ static int amdgpu_bo_move(struct ttm_buf + return r; + + amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm); ++ amdgpu_bo_move_notify(bo, evict, new_mem); + ttm_resource_free(bo, &bo->resource); + ttm_bo_assign_mem(bo, new_mem); +- goto out; ++ return 0; + } + + if (old_mem->mem_type == AMDGPU_PL_GDS || +@@ -512,8 +515,9 @@ static int amdgpu_bo_move(struct ttm_buf + new_mem->mem_type == AMDGPU_PL_GWS || + new_mem->mem_type == AMDGPU_PL_OA) { + /* Nothing to save here */ ++ amdgpu_bo_move_notify(bo, evict, new_mem); + ttm_bo_move_null(bo, new_mem); +- goto out; ++ return 0; + } + + if (bo->type == ttm_bo_type_device && +@@ -525,22 +529,23 @@ static int amdgpu_bo_move(struct ttm_buf + abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; + } + +- if (adev->mman.buffer_funcs_enabled) { +- if (((old_mem->mem_type == TTM_PL_SYSTEM && +- new_mem->mem_type == TTM_PL_VRAM) || +- (old_mem->mem_type == TTM_PL_VRAM && +- new_mem->mem_type == TTM_PL_SYSTEM))) { +- hop->fpfn = 0; +- hop->lpfn = 0; +- hop->mem_type = TTM_PL_TT; +- hop->flags = TTM_PL_FLAG_TEMPORARY; +- return -EMULTIHOP; +- } ++ if (adev->mman.buffer_funcs_enabled && ++ ((old_mem->mem_type == TTM_PL_SYSTEM && ++ new_mem->mem_type == TTM_PL_VRAM) || ++ (old_mem->mem_type == TTM_PL_VRAM && ++ new_mem->mem_type == TTM_PL_SYSTEM))) { ++ hop->fpfn = 0; ++ hop->lpfn = 0; ++ hop->mem_type = TTM_PL_TT; ++ hop->flags = TTM_PL_FLAG_TEMPORARY; ++ return -EMULTIHOP; ++ } + ++ amdgpu_bo_move_notify(bo, evict, new_mem); ++ if (adev->mman.buffer_funcs_enabled) + r = amdgpu_move_blit(bo, evict, new_mem, old_mem); +- } else { ++ else + r = -ENODEV; +- } + + if (r) { + /* Check that all memory is CPU accessible */ +@@ -555,11 +560,10 @@ static int amdgpu_bo_move(struct ttm_buf + return r; + } + +- trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type); +-out: +- /* update statistics */ ++ /* update statistics after the move */ ++ if (evict) ++ atomic64_inc(&adev->num_evictions); + atomic64_add(bo->base.size, &adev->num_bytes_moved); +- amdgpu_bo_move_notify(bo, evict); + return 0; + } + +@@ -1505,7 +1509,7 @@ static int amdgpu_ttm_access_memory(stru + static void + amdgpu_bo_delete_mem_notify(struct ttm_buffer_object *bo) + { +- amdgpu_bo_move_notify(bo, false); ++ amdgpu_bo_move_notify(bo, false, NULL); + } + + static struct ttm_device_funcs amdgpu_bo_driver = { diff --git a/queue-6.1/series b/queue-6.1/series index b232da88ffd..8ca98760d35 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -181,3 +181,4 @@ gpiolib-cdev-relocate-debounce_period_us-from-struct.patch gpiolib-cdev-fix-uninitialised-kfifo.patch drm-amd-display-atom-integrated-system-info-v2_2-for.patch maintainers-add-leah-to-6.1-maintainers-file.patch +drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch