1
0
Fork 0
alistair23-linux/drivers/gpu/drm/radeon
Lukas Wunner 15734feff2 drm/radeon: Fix deadlock on runtime suspend
radeon's ->runtime_suspend hook calls drm_kms_helper_poll_disable(),
which waits for the output poll worker to finish if it's running.

The output poll worker meanwhile calls pm_runtime_get_sync() in
radeon's ->detect hooks, which waits for the ongoing suspend to finish,
causing a deadlock.

Fix by not acquiring a runtime PM ref if the ->detect hooks are called
in the output poll worker's context.  This is safe because the poll
worker is only enabled while runtime active and we know that
->runtime_suspend waits for it to finish.

Stack trace for posterity:

  INFO: task kworker/0:3:31847 blocked for more than 120 seconds
  Workqueue: events output_poll_execute [drm_kms_helper]
  Call Trace:
   schedule+0x3c/0x90
   rpm_resume+0x1e2/0x690
   __pm_runtime_resume+0x3f/0x60
   radeon_lvds_detect+0x39/0xf0 [radeon]
   output_poll_execute+0xda/0x1e0 [drm_kms_helper]
   process_one_work+0x14b/0x440
   worker_thread+0x48/0x4a0

  INFO: task kworker/2:0:10493 blocked for more than 120 seconds.
  Workqueue: pm pm_runtime_work
  Call Trace:
   schedule+0x3c/0x90
   schedule_timeout+0x1b3/0x240
   wait_for_common+0xc2/0x180
   wait_for_completion+0x1d/0x20
   flush_work+0xfc/0x1a0
   __cancel_work_timer+0xa5/0x1d0
   cancel_delayed_work_sync+0x13/0x20
   drm_kms_helper_poll_disable+0x1f/0x30 [drm_kms_helper]
   radeon_pmops_runtime_suspend+0x3d/0xa0 [radeon]
   pci_pm_runtime_suspend+0x61/0x1a0
   vga_switcheroo_runtime_suspend+0x21/0x70
   __rpm_callback+0x32/0x70
   rpm_callback+0x24/0x80
   rpm_suspend+0x12b/0x640
   pm_runtime_work+0x6f/0xb0
   process_one_work+0x14b/0x440
   worker_thread+0x48/0x4a0

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94147
Fixes: 10ebc0bc09 ("drm/radeon: add runtime PM support (v2)")
Cc: stable@vger.kernel.org # v3.13+: 27d4ee03078a: workqueue: Allow retrieval of current task's work struct
Cc: stable@vger.kernel.org # v3.13+: 25c058ccaf2e: drm: Allow determining if current task is output poll worker
Cc: Ismo Toijala <ismo.toijala@gmail.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Dave Airlie <airlied@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Link: https://patchwork.freedesktop.org/patch/msgid/64ea02c44f91dda19bc563902b97bbc699040392.1518338789.git.lukas@wunner.de
2018-02-16 22:37:27 +01:00
..
reg_srcs
.gitignore
Kconfig drm/radeon: remove UMS support 2015-12-02 12:45:54 -05:00
Makefile main drm pull request for v4.15 2017-11-15 20:42:10 -08:00
ObjectID.h
atom-bits.h
atom-names.h
atom-types.h
atom.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
atom.h drm/radeon: add locking around atombios scratch space usage 2014-11-11 17:22:26 -05:00
atombios.h scripts/spelling.txt: add "aligment" pattern and fix typo instances 2017-02-27 18:43:46 -08:00
atombios_crtc.c drm: radeon: remove dead code and pointless local lut storage 2017-08-04 11:36:17 +02:00
atombios_dp.c drm/radeon: fix atombios on big endian 2017-10-31 18:24:59 -04:00
atombios_encoders.c drm/radeon: Fix eDP for single-display iMac10,1 (v2) 2017-07-07 11:11:28 -04:00
atombios_i2c.c drm/radeon: add locking around atombios scratch space usage 2014-11-11 17:22:26 -05:00
avivod.h
btc_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
btc_dpm.h Revert "drm/radeon: drop btc_get_max_clock_from_voltage_dependency_table" 2014-10-13 11:34:13 -04:00
btcd.h
cayman_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
cayman_blit_shaders.h
ci_dpm.c drm/radeon: move ci_send_msg_to_smc to where it's used 2017-10-08 20:16:28 -04:00
ci_dpm.h drm/radeon: move ci_send_msg_to_smc to where it's used 2017-10-08 20:16:28 -04:00
ci_smc.c drm/radeon: move ci_send_msg_to_smc to where it's used 2017-10-08 20:16:28 -04:00
cik.c drm/radeon: remove init of CIK VMIDs 8-16 for amdkfd 2017-11-29 14:43:20 -05:00
cik_blit_shaders.c
cik_blit_shaders.h
cik_reg.h drm/radeon: Add H/W debugger kfd->kgd functions 2015-06-03 11:31:12 +03:00
cik_sdma.c drm/radeon: Avoid double gpu reset by adding a timeout on IB ring tests. 2016-02-10 14:17:15 -05:00
cikd.h drm/radeon: deprecate and remove KFD interface 2017-10-30 14:16:21 +01:00
clearstate_cayman.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
clearstate_ci.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
clearstate_defs.h
clearstate_evergreen.h
clearstate_si.h drm/radeon: use NULL instead of zero in clearstate headers 2014-06-02 10:25:07 -04:00
cypress_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
cypress_dpm.h
dce3_1_afmt.c drm/radeon: use proper ACR regisiter for DCE3.2 2015-06-01 23:16:22 -04:00
dce6_afmt.c drm/radeon: Add a common function for DFS handling 2016-01-27 12:48:32 -05:00
evergreen.c Linux 4.12-rc7 2017-06-27 08:28:30 +10:00
evergreen_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
evergreen_blit_shaders.h
evergreen_cs.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
evergreen_dma.c drm/radeon: split semaphore and sync object handling v2 2014-11-20 13:00:16 -05:00
evergreen_hdmi.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
evergreen_reg.h drm/radeon: fix vertical bars appear on monitor (v2) 2016-04-27 12:27:08 -04:00
evergreen_smc.h drm/radeon/dpm: fix typo in EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters 2014-03-06 16:46:58 -05:00
evergreend.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
kv_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
kv_dpm.h
kv_smc.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
mkregtable.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ni.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
ni_dma.c drm/radeon: Remove rdev->gart.pages_addr array 2015-01-22 11:48:03 -05:00
ni_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
ni_dpm.h
ni_reg.h drm/radeon/mst: port some MST setup code from DAL. 2016-04-06 14:57:46 -04:00
nid.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
nislands_smc.h
ppsmc.h drm/radeon/dpm: add thermal dpm support for CI 2014-11-20 13:00:10 -05:00
pptable.h drm/radeon/dpm: add smc fan control for CI (v2) 2014-11-20 13:00:10 -05:00
r100.c drm: Pass struct drm_file * to __drm_mode_object_find [v2] 2017-10-12 10:03:04 +10:00
r100_track.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
r100d.h
r200.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
r300.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
r300_reg.h
r300d.h
r420.c drm/radeon: check return value of radeon_ring_lock 2017-04-28 17:33:02 -04:00
r420d.h
r500_reg.h drm/radeon: Bypass hw lut's for > 8 bpc framebuffer scanout. 2014-06-13 12:22:30 -04:00
r520.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
r520d.h
r600.c drm/radeon: Unbreak HPD handling for r600+ 2017-05-24 17:39:33 -04:00
r600_blit_shaders.c drm: fix trivial typos 2015-10-21 11:35:11 -04:00
r600_blit_shaders.h
r600_cs.c drm: Pass struct drm_file * to __drm_mode_object_find [v2] 2017-10-12 10:03:04 +10:00
r600_dma.c drm/radeon: Avoid double gpu reset by adding a timeout on IB ring tests. 2016-02-10 14:17:15 -05:00
r600_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
r600_dpm.h drm/radeon/dpm: add smc fan control for SI (v2) 2014-11-20 13:00:09 -05:00
r600_hdmi.c drm/radeon: properly initialize r600_audio_status() data 2017-09-18 23:30:30 -04:00
r600_reg.h
r600d.h drm/radeon: add support for UVD_NO_OP register 2016-08-24 16:25:04 -04:00
radeon.h drm/radeon: deprecate and remove KFD interface 2017-10-30 14:16:21 +01:00
radeon_acpi.c drm/radeon: Make radeon_atif_handler static 2017-08-15 14:46:07 -04:00
radeon_acpi.h drm/radeon: Make radeon_atif_handler static 2017-08-15 14:46:07 -04:00
radeon_agp.c add blacklist for thinkpad T40p 2015-11-30 14:44:34 -05:00
radeon_asic.c drm/radeon: add driver option to disable vce block. 2016-05-02 13:08:53 -04:00
radeon_asic.h drm/radeon: Support DRM_MODE_PAGE_FLIP_ASYNC 2016-05-04 20:19:03 -04:00
radeon_atombios.c drm/radeon: add missing header dependencies 2016-10-25 14:38:18 -04:00
radeon_atpx_handler.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
radeon_audio.c drm: handle HDMI 2.0 VICs in AVI info-frames 2017-07-14 21:23:54 +03:00
radeon_audio.h drm/radeon: Add a common function for DFS handling 2016-01-27 12:48:32 -05:00
radeon_benchmark.c drm/radeon: fix the crash in benchmark functions 2015-02-02 11:39:35 -05:00
radeon_bios.c drm/radeon: remove some dead code 2017-02-08 21:04:29 -05:00
radeon_clocks.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
radeon_combios.c drm/radeon: add a quirk for Toshiba Satellite L20-183 2017-06-20 12:06:51 -04:00
radeon_connectors.c drm/radeon: Fix deadlock on runtime suspend 2018-02-16 22:37:27 +01:00
radeon_cs.c drm/radeon: Fix preferred typo 2017-08-15 14:46:16 -04:00
radeon_cursor.c drm/radeon: switch to drm_*{get,put} helpers 2017-08-15 14:46:12 -04:00
radeon_device.c drm/radeon: disable hard reset in hibernate for APUs 2017-09-15 11:55:27 -04:00
radeon_display.c drm/radeon: switch to drm_*{get,put} helpers 2017-08-15 14:46:12 -04:00
radeon_dp_auxch.c drm/radeon/dp_auxch: Ratelimit aux transfer debug messages 2017-03-29 23:53:21 -04:00
radeon_dp_mst.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
radeon_drv.c drm/radeon: deprecate and remove KFD interface 2017-10-30 14:16:21 +01:00
radeon_drv.h drm/radeon: remove UMS support 2015-12-02 12:45:54 -05:00
radeon_encoders.c drm/radeon: move bl encoder assignment into bl init 2015-10-29 11:13:18 -04:00
radeon_family.h drm/radeon: add Mullins chip family 2014-05-06 12:19:57 +02:00
radeon_fb.c Revert "drm/radeon: dont switch vt on suspend" 2017-11-17 15:01:31 -05:00
radeon_fence.c sched/wait: Rename wait_queue_t => wait_queue_entry_t 2017-06-20 12:18:27 +02:00
radeon_gart.c drm: use set_memory.h header 2017-05-08 17:15:14 -07:00
radeon_gem.c locking/atomics: COCCINELLE/treewide: Convert trivial ACCESS_ONCE() patterns to READ_ONCE()/WRITE_ONCE() 2017-10-25 11:01:08 +02:00
radeon_i2c.c drm/radeon: fix up dp aux tear down (v2) 2016-10-12 15:44:13 -04:00
radeon_ib.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_irq_kms.c Merge branch 'drm-next-4.14' of git://people.freedesktop.org/~agd5f/linux into drm-next 2017-08-02 12:43:12 +10:00
radeon_kms.c drm/radeon: deprecate and remove KFD interface 2017-10-30 14:16:21 +01:00
radeon_legacy_crtc.c drm: radeon: remove dead code and pointless local lut storage 2017-08-04 11:36:17 +02:00
radeon_legacy_encoders.c drm/radeon: add missing header dependencies 2016-10-25 14:38:18 -04:00
radeon_legacy_tv.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
radeon_mn.c lib/interval_tree: fast overlap detection 2017-09-08 18:26:49 -07:00
radeon_mode.h drm/radeon/dp: make radeon_dp_get_dp_link_config static 2017-10-08 20:16:29 -04:00
radeon_object.c drm/radeon: Fix preferred typo 2017-08-15 14:46:16 -04:00
radeon_object.h drm/ttm: add evict parameter to ttm_bo_driver::move_notify 2017-01-27 11:13:15 -05:00
radeon_pm.c drm/radeon/pm: autoswitch power state when in balanced mode 2016-10-25 14:44:03 -04:00
radeon_prime.c drm/radeon: Maintain prime import/export refcount for BOs 2017-04-07 12:20:40 -04:00
radeon_reg.h
radeon_ring.c drm: drop drm_[cm]alloc* helpers 2017-05-18 17:22:39 +02:00
radeon_sa.c drm/radeon: hold reference to fences in radeon_sa_bo_new 2016-02-10 14:07:44 -05:00
radeon_semaphore.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_sync.c dma-buf: Rename struct fence to dma_fence 2016-10-25 14:40:39 +02:00
radeon_test.c drm/radeon: check return value of radeon_fence_emit 2017-04-28 17:33:02 -04:00
radeon_trace.h main drm pull request for v4.15 2017-11-15 20:42:10 -08:00
radeon_trace_points.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
radeon_ttm.c main drm pull request for v4.15 2017-11-15 20:42:10 -08:00
radeon_ucode.c drm/radeon: add new firmware header definitions (v3) 2014-08-05 08:53:22 -04:00
radeon_ucode.h drm/radeon: add new firmware header definitions (v3) 2014-08-05 08:53:22 -04:00
radeon_uvd.c drm/radeon: fix "force the UVD DPB into VRAM as well" 2017-06-14 09:23:42 -04:00
radeon_vce.c drm/radeon: fix indentation. 2016-03-16 18:08:06 -04:00
radeon_vm.c lib/interval_tree: fast overlap detection 2017-09-08 18:26:49 -07:00
rs100d.h
rs400.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
rs400d.h
rs600.c drm/radeon: Support DRM_MODE_PAGE_FLIP_ASYNC 2016-05-04 20:19:03 -04:00
rs600d.h
rs690.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
rs690d.h
rs780_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rs780_dpm.h
rs780d.h
rv6xx_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rv6xx_dpm.h
rv6xxd.h
rv200d.h
rv250d.h
rv350d.h
rv515.c gpu: drm: amd/radeon: Convert printk(KERN_<LEVEL> to pr_<level> 2017-03-29 23:53:24 -04:00
rv515d.h
rv730_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rv730d.h
rv740_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rv740d.h
rv770.c drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
rv770_dma.c drm/radeon: split semaphore and sync object handling v2 2014-11-20 13:00:16 -05:00
rv770_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rv770_dpm.h drm/radeon: comment out some currently unused 7xx dpm code 2015-01-22 10:38:58 -05:00
rv770_smc.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
rv770_smc.h
rv770d.h drm/radeon: switch UVD code to use UVD_NO_OP for padding 2016-08-24 16:25:05 -04:00
si.c Linux 4.12-rc7 2017-06-27 08:28:30 +10:00
si_blit_shaders.c
si_blit_shaders.h
si_dma.c drm/radeon: Remove rdev->gart.pages_addr array 2015-01-22 11:48:03 -05:00
si_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
si_dpm.h drm/radeon: bind fan control on SI cards to hwmon interface 2015-01-22 10:38:48 -05:00
si_reg.h
si_smc.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
sid.h drm/radeon: allow TA_CS_BC_BASE_ADDR on SI 2016-10-12 15:44:15 -04:00
sislands_smc.h drm/radeon/si/dpm: fix phase shedding setup 2016-09-28 16:13:16 -04:00
smu7.h
smu7_discrete.h drm/radeon/dpm: add smc fan control for CI (v2) 2014-11-20 13:00:10 -05:00
smu7_fusion.h
sumo_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
sumo_dpm.h drm/radeon: comment out some currently unused sumo dpm code 2015-01-22 10:38:57 -05:00
sumo_smc.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
sumod.h
trinity_dpm.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
trinity_dpm.h
trinity_smc.c drm/radeon: fix include notation and remove -Iinclude/drm flag 2017-05-17 14:36:40 +02:00
trinityd.h
uvd_v1_0.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
uvd_v2_2.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
uvd_v3_1.c
uvd_v4_2.c drm/radeon: handle more than 10 UVD sessions 2016-05-04 20:19:43 -04:00
vce_v1_0.c drm/radeon: avoid kernel segfault in vce when gpu fails to resume 2017-02-08 20:59:16 -05:00
vce_v2_0.c drm/radeon: add header comment for clarification to vce_v2_0_enable_mgcg() 2017-07-14 11:05:55 -04:00