[Public] Thank you for the fix. Could you please add the following the tags?
| Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/ Reviewed-by: Prike Liang <[email protected]> Regards, Prike > -----Original Message----- > From: Timur Kristóf <[email protected]> > Sent: Sunday, January 18, 2026 8:58 PM > To: [email protected]; Deucher, Alexander > <[email protected]>; Koenig, Christian <[email protected]>; > Liang, Prike <[email protected]>; Limonciello, Mario > <[email protected]> > Cc: Timur Kristóf <[email protected]> > Subject: [PATCH] drm/amdgpu: Fix validating flush_gpu_tlb_pasid() > > When a function holds a lock and we return without unlocking it, it deadlocks > the > kernel. We should always unlock before returning. > > This commit fixes suspend/resume on SI. > Tested on two Tahiti GPUs: FirePro W9000 and R9 280X. > > Fixes: bc2dea30038a ("drm/amdgpu: validate the flush_gpu_tlb_pasid()") > Signed-off-by: Timur Kristóf <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > index 0e67fa4338ff..4fa24be1bf45 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > @@ -769,7 +769,7 @@ int amdgpu_gmc_flush_gpu_tlb_pasid(struct > amdgpu_device *adev, uint16_t pasid, > struct amdgpu_ring *ring = &adev->gfx.kiq[inst].ring; > struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst]; > unsigned int ndw; > - int r, cnt = 0; > + int r = 0, cnt = 0; > uint32_t seq; > > /* > @@ -782,7 +782,7 @@ int amdgpu_gmc_flush_gpu_tlb_pasid(struct > amdgpu_device *adev, uint16_t pasid, > if (!adev->gmc.flush_pasid_uses_kiq || !ring->sched.ready) { > > if (!adev->gmc.gmc_funcs->flush_gpu_tlb_pasid) > - return 0; > + goto error_unlock_reset; > > if (adev->gmc.flush_tlb_needs_extra_type_2) > adev->gmc.gmc_funcs->flush_gpu_tlb_pasid(adev, pasid, > @@ -797,7 +797,6 @@ int amdgpu_gmc_flush_gpu_tlb_pasid(struct > amdgpu_device *adev, uint16_t pasid, > adev->gmc.gmc_funcs->flush_gpu_tlb_pasid(adev, pasid, > flush_type, all_hub, > inst); > - r = 0; > } else { > /* 2 dwords flush + 8 dwords fence */ > ndw = kiq->pmf->invalidate_tlbs_size + 8; > -- > 2.52.0
