FAILED: patch "[PATCH] drm/amdgpu: add missing lock to amdgpu_ttm_access_memory_sdma" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 4fa944255be521b1bbd9780383f77206303a3a5c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026010504-compacter-plow-0408@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4fa944255be521b1bbd9780383f77206303a3a5c Mon Sep 17 00:00:00 2001
From: Pierre-Eric Pelloux-Prayer <[email protected]>
Date: Tue, 25 Nov 2025 10:48:39 +0100
Subject: [PATCH] drm/amdgpu: add missing lock to amdgpu_ttm_access_memory_sdma
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Users of ttm entities need to hold the gtt_window_lock before using them to guarantee proper ordering of jobs.
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +2 -0
@@ -1486,6 +1486,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo,if (r) goto out; +mutex_lock (&adev->mman.gtt_window_lock);amdgpu_res_first (abo->tbo.resource, offset, len, &src_mm); src_addr =amdgpu_ttm_domain_start (adev, bo->resource->mem_type) + src_mm.start;
@@ -1500,6 +1501,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo,WARN_ON (job->ibs[0 ].length_dw > num_dw); fence =amdgpu_job_submit (job); +mutex_unlock (&adev->mman.gtt_window_lock);if (!dma_fence_wait_timeout (fence, false, adev->sdma_timeout)) r = -ETIMEDOUT ;
Sasha Levin
maintainerPATCH 1/2 drm/amdgpu: cleanup scheduler job initialization v2
From: Christian König <[email protected]>
[ Upstream commit f7d66fb2ea43a3016e78a700a2ca6c77a74579f9 ]
Init the DRM scheduler base class while allocating the job.
This makes the whole handling much more cleaner.
v2: fix coding style
Stable-dep-of: 4fa944255be5 ("drm/amdgpu: add missing lock to amdgpu_ttm_access_memory_sdma")
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 8 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 44 ++++++++------- drivers/gpu/drm/amd/amdgpu/amdgpu_job.h | 14 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 7 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 56 +++++++------------ drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 9 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 13 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 22 +++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c | 61 +++++++++++---------- drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 12 ++-- drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 8 +-- drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 12 ++-- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 17 ++---- 14 files changed, 135 insertions(+), 150 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +1 -1
@@ -673,7 +673,7 @@ int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev, goto err; } - ret =amdgpu_job_alloc (adev,1 , &job,NULL ); + ret =amdgpu_job_alloc (adev,NULL ,NULL ,NULL ,1 , &job);if (ret) goto err;
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +2 -6
@@ -285,12 +285,8 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, }for (i =0 ; i < p->gang_size; ++i) { - ret =amdgpu_job_alloc (p->adev, num_ibs[i], &p->jobs[i], vm); -if (ret) - goto free_all_kdata; - - ret =drm_sched_job_init (&p->jobs[i]->base, p->entities[i], - &fpriv->vm); + ret =amdgpu_job_alloc (p->adev, vm, p->entities[i], vm, + num_ibs[i], &p->jobs[i]);if (ret) goto free_all_kdata; }
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +23 -21
85 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +8 -6
@@ -78,18 +78,20 @@ static inline struct amdgpu_ring *amdgpu_job_ring(struct amdgpu_job *job)return to_amdgpu_ring (job->base.entity->rq->sched); } -int amdgpu_job_alloc (struct amdgpu_device *adev,unsigned num_ibs, -struct amdgpu_job **job,struct amdgpu_vm *vm); -int amdgpu_job_alloc_with_ib (struct amdgpu_device *adev,unsigned size, -enum amdgpu_ib_pool_type pool,struct amdgpu_job **job); +int amdgpu_job_alloc (struct amdgpu_device *adev,struct amdgpu_vm *vm, +struct drm_sched_entity *entity,void *owner, +unsigned int num_ibs,struct amdgpu_job **job); +int amdgpu_job_alloc_with_ib (struct amdgpu_device *adev, +struct drm_sched_entity *entity,void *owner, +size_t size,enum amdgpu_ib_pool_type pool_type, +struct amdgpu_job **job);void amdgpu_job_set_resources (struct amdgpu_job *job,struct amdgpu_bo *gds,struct amdgpu_bo *gws,struct amdgpu_bo *oa);void amdgpu_job_free_resources (struct amdgpu_job *job);void amdgpu_job_set_gang_leader (struct amdgpu_job *job,struct amdgpu_job *leader);void amdgpu_job_free (struct amdgpu_job *job); -int amdgpu_job_submit (struct amdgpu_job *job,struct drm_sched_entity *entity, -void *owner,struct dma_fence **f); +struct dma_fence *amdgpu_job_submit (struct amdgpu_job *job);int amdgpu_job_submit_direct (struct amdgpu_job *job,struct amdgpu_ring *ring,struct dma_fence **fence);
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +4 -3
@@ -152,14 +152,15 @@ static int amdgpu_jpeg_dec_set_reg(struct amdgpu_ring *ring, uint32_t handle,const unsigned ib_size_dw =16 ;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , ib_size_dw *4 , +AMDGPU_IB_POOL_DIRECT , &job);if (r)return r; ib = &job->ibs[0 ]; - ib->ptr[0 ] =PACKETJ (adev->jpeg.internal.jpeg_pitch,0 ,0 ,PACKETJ_TYPE0 ); + ib->ptr[0 ] =PACKETJ (adev->jpeg.internal.jpeg_pitch,0 ,0 , +PACKETJ_TYPE0 ); ib->ptr[1 ] =0xDEADBEEF ;for (i =2 ; i <16 ; i +=2 ) { ib->ptr[i] =PACKETJ (0 ,0 ,0 ,PACKETJ_TYPE6 );
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +21 -35
117 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +4 -5
@@ -1132,7 +1132,9 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,unsigned offset_idx =0 ;unsigned offset[3 ] = {UVD_BASE_SI ,0 ,0 }; - r =amdgpu_job_alloc_with_ib (adev,64 , direct ?AMDGPU_IB_POOL_DIRECT : + r =amdgpu_job_alloc_with_ib (ring->adev, &adev->uvd.entity, +AMDGPU_FENCE_OWNER_UNDEFINED , +64 , direct ?AMDGPU_IB_POOL_DIRECT :AMDGPU_IB_POOL_DELAYED , &job);if (r)return r;
@@ -1181,10 +1183,7 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,if (r) goto err_free; - r =amdgpu_job_submit (job, &adev->uvd.entity, -AMDGPU_FENCE_OWNER_UNDEFINED , &f); -if (r) - goto err_free; + f =amdgpu_job_submit (job); }amdgpu_bo_reserve (bo, true);
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +8 -5
@@ -450,8 +450,10 @@ static int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,uint64_t addr;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev, &ring->adev->vce.entity, +AMDGPU_FENCE_OWNER_UNDEFINED , + ib_size_dw *4 ,AMDGPU_IB_POOL_DIRECT , + &job);if (r)return r;
@@ -538,7 +540,9 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,struct dma_fence *f =NULL ;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , + r =amdgpu_job_alloc_with_ib (ring->adev, &ring->adev->vce.entity, +AMDGPU_FENCE_OWNER_UNDEFINED , + ib_size_dw *4 , direct ?AMDGPU_IB_POOL_DIRECT :AMDGPU_IB_POOL_DELAYED , &job);if (r)
@@ -570,8 +574,7 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,if (direct) r =amdgpu_job_submit_direct (job, ring, &f);else - r =amdgpu_job_submit (job, &ring->adev->vce.entity, -AMDGPU_FENCE_OWNER_UNDEFINED , &f); + f =amdgpu_job_submit (job);if (r) goto err;
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +13 -9
@@ -627,15 +627,16 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring,struct amdgpu_ib *ib_msg, struct dma_fence **fence) { + u64 addr = AMDGPU_GPU_PAGE_ALIGN(ib_msg->gpu_addr);struct amdgpu_device *adev = ring->adev;struct dma_fence *f =NULL ;struct amdgpu_job *job;struct amdgpu_ib *ib; -uint64_t addr =AMDGPU_GPU_PAGE_ALIGN (ib_msg->gpu_addr);int i, r; - r =amdgpu_job_alloc_with_ib (adev,64 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , +64 ,AMDGPU_IB_POOL_DIRECT , + &job);if (r) goto err;
@@ -813,8 +814,9 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,if (adev->vcn.using_unified_queue) ib_size_dw +=8 ; - r =amdgpu_job_alloc_with_ib (adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , + ib_size_dw *4 ,AMDGPU_IB_POOL_DIRECT , + &job);if (r) goto err;
@@ -942,8 +944,9 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handif (adev->vcn.using_unified_queue) ib_size_dw +=8 ; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , + ib_size_dw *4 ,AMDGPU_IB_POOL_DIRECT , + &job);if (r)return r;
@@ -1008,8 +1011,9 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t hanif (adev->vcn.using_unified_queue) ib_size_dw +=8 ; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , + ib_size_dw *4 ,AMDGPU_IB_POOL_DIRECT , + &job);if (r)return r;
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +31 -30
111 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c +4 -8
@@ -371,7 +371,9 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,* translation. Avoid this by doing the invalidation from the SDMA * itself. */ - r =amdgpu_job_alloc_with_ib (adev,16 *4 ,AMDGPU_IB_POOL_IMMEDIATE , + r =amdgpu_job_alloc_with_ib (ring->adev, &adev->mman.entity, +AMDGPU_FENCE_OWNER_UNDEFINED , +16 *4 ,AMDGPU_IB_POOL_IMMEDIATE , &job);if (r) goto error_alloc;
@@ -380,10 +382,7 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid, job->vm_needs_flush = true; job->ibs->ptr[job->ibs->length_dw++] = ring->funcs->nop;amdgpu_ring_pad_ib (ring, &job->ibs[0 ]); - r =amdgpu_job_submit (job, &adev->mman.entity, -AMDGPU_FENCE_OWNER_UNDEFINED , &fence); -if (r) - goto error_submit; + fence =amdgpu_job_submit (job);mutex_unlock (&adev->mman.gtt_window_lock);
@@ -392,9 +391,6 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,return ; -error_submit: -amdgpu_job_free (job); - error_alloc:mutex_unlock (&adev->mman.gtt_window_lock);DRM_ERROR ("Error flushing GPU TLB using the SDMA (%d)!\n" , r);
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +4 -4
@@ -216,8 +216,8 @@ static int uvd_v6_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handleuint64_t addr;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , ib_size_dw *4 , +AMDGPU_IB_POOL_DIRECT , &job);if (r)return r;
@@ -280,8 +280,8 @@ static int uvd_v6_0_enc_get_destroy_msg(struct amdgpu_ring *ring,uint64_t addr;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , ib_size_dw *4 , +AMDGPU_IB_POOL_DIRECT , &job);if (r)return r;
drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +6 -6
@@ -213,7 +213,7 @@ static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring)* * Open up a stream for HW test */ -static int uvd_v7_0_enc_get_create_msg (struct amdgpu_ring *ring,uint32_t handle, +static int uvd_v7_0_enc_get_create_msg (struct amdgpu_ring *ring,u32 handle,struct amdgpu_bo *bo,struct dma_fence **fence) {
@@ -224,8 +224,8 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handleuint64_t addr;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , ib_size_dw *4 , +AMDGPU_IB_POOL_DIRECT , &job);if (r)return r;
@@ -276,7 +276,7 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle* * Close up a stream for HW test or if userspace failed to do so */ -static int uvd_v7_0_enc_get_destroy_msg (struct amdgpu_ring *ring,uint32_t handle, +static int uvd_v7_0_enc_get_destroy_msg (struct amdgpu_ring *ring,u32 handle,struct amdgpu_bo *bo,struct dma_fence **fence) {
@@ -287,8 +287,8 @@ static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handluint64_t addr;int i, r; - r =amdgpu_job_alloc_with_ib (ring->adev, ib_size_dw *4 , -AMDGPU_IB_POOL_DIRECT , &job); + r =amdgpu_job_alloc_with_ib (ring->adev,NULL ,NULL , ib_size_dw *4 , +AMDGPU_IB_POOL_DIRECT , &job);if (r)return r;
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +6 -11
@@ -65,8 +65,11 @@ svm_migrate_gart_map(struct amdgpu_ring *ring, uint64_t npages, num_dw =ALIGN (adev->mman.buffer_funcs->copy_num_dw,8 ); num_bytes = npages *8 ; - r =amdgpu_job_alloc_with_ib (adev, num_dw *4 + num_bytes, -AMDGPU_IB_POOL_DELAYED , &job); + r =amdgpu_job_alloc_with_ib (adev, &adev->mman.entity, +AMDGPU_FENCE_OWNER_UNDEFINED , + num_dw *4 + num_bytes, +AMDGPU_IB_POOL_DELAYED , + &job);if (r)return r;
@@ -89,18 +92,10 @@ svm_migrate_gart_map(struct amdgpu_ring *ring, uint64_t npages, cpu_addr = &job->ibs[0 ].ptr[num_dw];amdgpu_gart_map (adev,0 , npages, addr, pte_flags, cpu_addr); - r =amdgpu_job_submit (job, &adev->mman.entity, -AMDGPU_FENCE_OWNER_UNDEFINED , &fence); -if (r) - goto error_free; - + fence =amdgpu_job_submit (job);dma_fence_put (fence);return r; - -error_free: -amdgpu_job_free (job); -return r; }/**
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/2 drm/amdgpu: add missing lock to amdgpu_ttm_access_memory_sdma
From: Pierre-Eric Pelloux-Prayer <[email protected]>
[ Upstream commit 4fa944255be521b1bbd9780383f77206303a3a5c ]
Users of ttm entities need to hold the gtt_window_lock before using them to guarantee proper ordering of jobs.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +2 -0
@@ -1425,6 +1425,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo,if (r) goto out; +mutex_lock (&adev->mman.gtt_window_lock);amdgpu_res_first (abo->tbo.resource, offset, len, &src_mm); src_addr =amdgpu_ttm_domain_start (adev, bo->resource->mem_type) + src_mm.start;
@@ -1439,6 +1440,7 @@ static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo,WARN_ON (job->ibs[0 ].length_dw > num_dw); fence =amdgpu_job_submit (job); +mutex_unlock (&adev->mman.gtt_window_lock);if (!dma_fence_wait_timeout (fence, false, adev->sdma_timeout)) r = -ETIMEDOUT ;
Signature · 1 line
2.51.0