drm/amd/display: Fix deadlock when flushing irq
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 <mikita.lipski@amd.com> Reviewed-by: Harry Wentland <Harry.Wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
75569c182e
commit
ad64dc0137
|
@ -329,14 +329,15 @@ void amdgpu_dm_irq_fini(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
int src;
|
int src;
|
||||||
struct irq_list_head *lh;
|
struct irq_list_head *lh;
|
||||||
|
unsigned long irq_table_flags;
|
||||||
DRM_DEBUG_KMS("DM_IRQ: releasing resources.\n");
|
DRM_DEBUG_KMS("DM_IRQ: releasing resources.\n");
|
||||||
|
|
||||||
for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) {
|
for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) {
|
||||||
|
DM_IRQ_TABLE_LOCK(adev, irq_table_flags);
|
||||||
/* The handler was removed from the table,
|
/* The handler was removed from the table,
|
||||||
* it means it is safe to flush all the 'work'
|
* it means it is safe to flush all the 'work'
|
||||||
* (because no code can schedule a new one). */
|
* (because no code can schedule a new one). */
|
||||||
lh = &adev->dm.irq_handler_list_low_tab[src];
|
lh = &adev->dm.irq_handler_list_low_tab[src];
|
||||||
|
DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags);
|
||||||
flush_work(&lh->work);
|
flush_work(&lh->work);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue