From: Mikita Lipski Date: Wed, 10 Jan 2018 15:01:38 +0000 (-0500) Subject: drm/amd/display: Fix deadlock when flushing irq X-Git-Tag: Ubuntu-4.15.0-33.36~434 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=ac1d5ddab0a9f600b510c459c2a681b8ad098d01;p=mirror_ubuntu-bionic-kernel.git drm/amd/display: Fix deadlock when flushing irq BugLink: http://bugs.launchpad.net/bugs/1778265 commit ad64dc0137968f09800e58174bbfd5eac9fe5418 upstream. Lock irq table when reading a work in queue, unlock to flush the work, lock again till all tasks are cleared Signed-off-by: Mikita Lipski Reviewed-by: Harry Wentland Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Kamal Mostafa Signed-off-by: Khalid Elmously --- diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c index ca5d0d1581dc..7a4a347216ff 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c @@ -400,14 +400,15 @@ void amdgpu_dm_irq_fini(struct amdgpu_device *adev) { int src; struct irq_list_head *lh; + unsigned long irq_table_flags; DRM_DEBUG_KMS("DM_IRQ: releasing resources.\n"); - for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) { - + DM_IRQ_TABLE_LOCK(adev, irq_table_flags); /* The handler was removed from the table, * it means it is safe to flush all the 'work' * (because no code can schedule a new one). */ lh = &adev->dm.irq_handler_list_low_tab[src]; + DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags); flush_work(&lh->work); }