From 79eea5e944a5cfada148ad4cac7eb264292aaa7e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 13 May 2024 10:50:42 +0200 Subject: [PATCH] 6.6-stable patches added patches: drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch --- ...comparison-in-amdgpu_res_cpu_visible.patch | 39 ++++ ...-the-call-oder-in-amdgpu_ttm_move-v2.patch | 195 ++++++++++++++++++ queue-6.6/series | 2 + 3 files changed, 236 insertions(+) create mode 100644 queue-6.6/drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch create mode 100644 queue-6.6/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch diff --git a/queue-6.6/drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch b/queue-6.6/drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch new file mode 100644 index 00000000000..61fe7185bf5 --- /dev/null +++ b/queue-6.6/drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch @@ -0,0 +1,39 @@ +From 8d2c930735f850e5be6860aeb39b27ac73ca192f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Wed, 8 May 2024 15:19:16 +0200 +Subject: drm/amdgpu: Fix comparison in amdgpu_res_cpu_visible +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Michel Dänzer + +commit 8d2c930735f850e5be6860aeb39b27ac73ca192f upstream. + +It incorrectly claimed a resource isn't CPU visible if it's located at +the very end of CPU visible VRAM. + +Fixes: a6ff969fe9cb ("drm/amdgpu: fix visible VRAM handling during faults") +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3343 +Reviewed-by: Christian König +Reviewed-by: Alex Deucher +Reported-and-Tested-by: Jeremy Day +Signed-off-by: Michel Dänzer +Signed-off-by: Alex Deucher +CC: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -432,7 +432,7 @@ bool amdgpu_res_cpu_visible(struct amdgp + + amdgpu_res_first(res, 0, res->size, &cursor); + while (cursor.remaining) { +- if ((cursor.start + cursor.size) >= adev->gmc.visible_vram_size) ++ if ((cursor.start + cursor.size) > adev->gmc.visible_vram_size) + return false; + amdgpu_res_next(&cursor, cursor.size); + } diff --git a/queue-6.6/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch b/queue-6.6/drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch new file mode 100644 index 00000000000..50db864f65b --- /dev/null +++ b/queue-6.6/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 +@@ -1249,14 +1249,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)) +@@ -1268,12 +1272,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, +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +@@ -328,7 +328,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 +@@ -486,14 +486,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) && +@@ -503,9 +505,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 || +@@ -517,8 +520,9 @@ static int amdgpu_bo_move(struct ttm_buf + new_mem->mem_type == AMDGPU_PL_OA || + new_mem->mem_type == AMDGPU_PL_DOORBELL) { + /* 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 && +@@ -530,22 +534,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 */ +@@ -560,11 +565,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; + } + +@@ -1568,7 +1572,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.6/series b/queue-6.6/series index 1c95bab9ec8..1915f71839b 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -218,3 +218,5 @@ gpiolib-cdev-fix-use-after-free-in-lineinfo_changed_.patch 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 +drm-amdgpu-fix-comparison-in-amdgpu_res_cpu_visible.patch +drm-amdgpu-once-more-fix-the-call-oder-in-amdgpu_ttm_move-v2.patch -- 2.47.2