linux/drivers/gpu/drm
Thomas Zimmermann 1ff30dd85e drm: Reverse lock order in pan_display_legacy()
Acquiring drm_client_dev.modeset_mutex after the locks in drm_fb_helper.dev
creates a deadlock with drm_setup_crtcs() as shown below:

  [    4.959319] fbcon: radeondrmfb (fb0) is primary device
  [    4.993952] Console: switching to colour frame buffer device 240x67
  [    4.994040]
  [    4.994041] ======================================================
  [    4.994041] WARNING: possible circular locking dependency detected
  [    4.994042] 5.2.0-rc4-1-default+ #39 Tainted: G            E
  [    4.994043] ------------------------------------------------------
  [    4.994043] systemd-udevd/369 is trying to acquire lock:
  [    4.994044] 00000000fb622acb (&client->modeset_mutex){+.+.}, at: drm_fb_helper_pan_display+0x103/0x1f0 [drm_kms_helper]
  [    4.994055]
  [    4.994055] but task is already holding lock:
  [    4.994055] 0000000028767ae4 (crtc_ww_class_mutex){+.+.}, at: drm_modeset_lock+0x42/0xf0 [drm]
  [    4.994072]
  [    4.994072] which lock already depends on the new lock.
  [    4.994072]
  [    4.994072]
  [    4.994072] the existing dependency chain (in reverse order) is:
  [    4.994073]
  [    4.994073] -> #3 (crtc_ww_class_mutex){+.+.}:
  [    4.994076]        lock_acquire+0x9e/0x170
  [    4.994079]        __ww_mutex_lock.constprop.18+0x97/0xf40
  [    4.994080]        ww_mutex_lock+0x30/0x90
  [    4.994091]        drm_modeset_lock+0x42/0xf0 [drm]
  [    4.994102]        drm_modeset_lock_all_ctx+0x1f/0xe0 [drm]
  [    4.994113]        drm_modeset_lock_all+0x5e/0x1a0 [drm]
  [    4.994163]        intel_modeset_init+0x60b/0xda0 [i915]
  ..
  [    4.994253]
  [    4.994253] -> #2 (crtc_ww_class_acquire){+.+.}:
  [    4.994255]        lock_acquire+0x9e/0x170
  [    4.994270]        drm_modeset_acquire_init+0xcc/0x100 [drm]
  [    4.994280]        drm_modeset_lock_all+0x44/0x1a0 [drm]
  [    4.994320]        intel_modeset_init+0x60b/0xda0 [i915]
  ..
  [    4.994403]
  [    4.994403] -> #1 (&dev->mode_config.mutex){+.+.}:
  [    4.994405]        lock_acquire+0x9e/0x170
  [    4.994408]        __mutex_lock+0x62/0x8c0
  [    4.994413]        drm_setup_crtcs+0x17c/0xc50 [drm_kms_helper]
  [    4.994418]        __drm_fb_helper_initial_config_and_unlock+0x34/0x530 [drm_kms_helper]
  [    4.994450]        radeon_fbdev_init+0x110/0x130 [radeon]
  ..
  [    4.994535]
  [    4.994535] -> #0 (&client->modeset_mutex){+.+.}:
  [    4.994537]        __lock_acquire+0xa85/0xe90
  [    4.994538]        lock_acquire+0x9e/0x170
  [    4.994540]        __mutex_lock+0x62/0x8c0
  [    4.994545]        drm_fb_helper_pan_display+0x103/0x1f0 [drm_kms_helper]
  [    4.994547]        fb_pan_display+0x92/0x120
  [    4.994549]        bit_update_start+0x1a/0x40
  [    4.994550]        fbcon_switch+0x392/0x580
  [    4.994552]        redraw_screen+0x12c/0x220
  [    4.994553]        do_bind_con_driver.cold.30+0xe1/0x10d
  [    4.994554]        do_take_over_console+0x113/0x190
  [    4.994555]        do_fbcon_takeover+0x58/0xb0
  [    4.994557]        notifier_call_chain+0x47/0x70
  [    4.994558]        blocking_notifier_call_chain+0x44/0x60
  [    4.994559]        register_framebuffer+0x231/0x310
  [    4.994564]        __drm_fb_helper_initial_config_and_unlock+0x2fd/0x530 [drm_kms_helper]
  [    4.994590]        radeon_fbdev_init+0x110/0x130 [radeon]
  ..

This problem was introduced in

  d81294afe	drm/fb-helper: Remove drm_fb_helper_crtc

Reversing the lock ordering in pan_display_legacy() fixes the issue.

Fixes: d81294afee ("drm/fb-helper: Remove drm_fb_helper_crtc")
Cc: Noralf Trønnes <noralf@tronnes.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <maxime.ripard@bootlin.com>
Cc: Sean Paul <sean@poorly.run>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20190611115716.7052-1-tzimmermann@suse.de
2019-06-12 10:14:07 +02:00
..
amd drm/amd: drop use of drmP.h in remaining files 2019-06-10 23:04:34 +02:00
arc treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
arm drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
armada drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
aspeed treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
ast drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
atmel-hlcdc drm/atmel-hlcdc: revert shift by 8 2019-06-04 23:52:09 +02:00
bochs drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
bridge drm/bridge/synopsys: dsi: add power on/off optional phy ops 2019-06-12 09:09:18 +02:00
cirrus drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
etnaviv drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
exynos treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
fsl-dcu treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
gma500 drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
hisilicon drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
i2c treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
i810 treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
i915 Features: 2019-05-28 09:26:52 +10:00
imx drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
lib
lima drm/lima: add timeout to drm scheduler init 2019-05-21 20:47:36 +08:00
mcde drm/mcde: Fix compile problems 2019-05-26 13:42:23 +02:00
mediatek drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
meson drm/meson: Add support for XBGR8888 & ABGR8888 formats 2019-06-07 10:33:15 +02:00
mga treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
mgag200 drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
msm drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
mxsfb treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
nouveau drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
omapdrm drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
panel drm/panel: truly: Add additional delay after pulling down reset gpio 2019-06-05 10:21:15 +02:00
panfrost drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
pl111 treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
qxl treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
r128 drm/r128: drop use of drmP.h 2019-06-05 20:31:19 +02:00
radeon drm/radeon: drop use of drmP.h (2/2) 2019-06-10 22:30:24 +02:00
rcar-du
rockchip drm/rockchip: dw_hdmi: Handle suspend/resume 2019-06-11 13:52:28 -04:00
savage drm/savage: drop use of drmP.h 2019-06-05 20:31:04 +02:00
scheduler drm/sched: Fix make htmldocs warnings. 2019-05-29 11:49:51 -05:00
selftests treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
shmobile
sis drm/sis: drop drmP.h use 2019-06-05 20:29:57 +02:00
sti drm/sti: drop use of drmP.h 2019-06-06 17:11:26 +02:00
stm drm/stm: dsi: add power on/off phy ops 2019-06-12 09:09:18 +02:00
sun4i drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
tdfx treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
tegra drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
tilcdc treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
tinydrm treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
ttm drm pull request for 5.2 2019-05-08 21:35:19 -07:00
tve200 treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
udl treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 13 2019-05-21 11:28:45 +02:00
v3d drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
vboxvideo Merge drm/drm-next into drm-misc-next 2019-05-22 16:08:21 -04:00
vc4 drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
vgem treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
via treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
virtio drm/virtio: Add memory barriers for capset cache. 2019-06-11 09:03:32 +02:00
vkms drm/vkms: Forward timer right after drm_crtc_handle_vblank 2019-06-06 20:36:21 -03:00
vmwgfx drm/vmwgfx: integer underflow in vmw_cmd_dx_set_shader() leading to an invalid read 2019-05-21 10:23:10 +02:00
xen treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
zte drm-misc-next for v5.3, try #2: 2019-05-28 08:59:11 +10:00
ati_pcigart.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_agpsupport.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_atomic_helper.c drm/atomic: Move __drm_atomic_helper_disable_plane/set_config() 2019-06-08 16:46:37 +02:00
drm_atomic_state_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_atomic_uapi.c Features: 2019-05-28 09:26:52 +10:00
drm_atomic.c drm/atomic: Move __drm_atomic_helper_disable_plane/set_config() 2019-06-08 16:46:37 +02:00
drm_auth.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_blend.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_bridge.c
drm_bufs.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_cache.c
drm_client_modeset.c drm/fb-helper: Move out modeset config code 2019-06-11 14:48:19 +02:00
drm_client.c drm/fb-helper: Remove drm_fb_helper_crtc 2019-06-04 12:13:47 +02:00
drm_color_mgmt.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_connector.c drm: Fix docbook warnings in hdr metadata helper structures 2019-06-04 14:03:53 +02:00
drm_context.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_crtc_helper_internal.h
drm_crtc_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_crtc_internal.h drm/atomic: Move __drm_atomic_helper_disable_plane/set_config() 2019-06-08 16:46:37 +02:00
drm_crtc.c
drm_damage_helper.c drm/damage-helper: Use NULL instead of 0 2019-05-28 09:03:06 +02:00
drm_debugfs_crc.c drm/crc-debugfs: Also sprinkle irqrestore over early exits 2019-06-07 16:49:12 +02:00
drm_debugfs.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_dma.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_dp_aux_dev.c drm/dp: drmP.h include removal 2019-05-06 16:00:48 +03:00
drm_dp_cec.c
drm_dp_dual_mode_helper.c drm/dp: drmP.h include removal 2019-05-06 16:00:48 +03:00
drm_dp_helper.c drm/dp: drmP.h include removal 2019-05-06 16:00:48 +03:00
drm_dp_mst_topology.c drm/mst: Fix MST sideband up-reply failure handling 2019-05-29 20:12:34 +03:00
drm_drv.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_dsc.c
drm_dumb_buffers.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_edid_load.c Merge remote-tracking branch 'drm/drm-next' into drm-misc-next 2019-05-28 09:39:08 +02:00
drm_edid.c drm/edid: Ignore "DFP 1.x" bit for EDID 1.2 and earlier 2019-06-06 16:18:15 +03:00
drm_encoder_slave.c
drm_encoder.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_fb_cma_helper.c
drm_fb_helper.c drm: Reverse lock order in pan_display_legacy() 2019-06-12 10:14:07 +02:00
drm_file.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_flip_work.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_format_helper.c drm: Remove users of drm_format_info_plane_cpp 2019-05-20 13:35:56 +02:00
drm_fourcc.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_framebuffer.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_gem_cma_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_gem_framebuffer_helper.c drm/docs: More links for implicit/explicit fencing. 2019-06-03 17:11:33 +02:00
drm_gem_shmem_helper.c
drm_gem_vram_helper.c drm: Ignore drm_gem_vram_mm_funcs in generated documentation 2019-06-06 09:44:40 +02:00
drm_gem.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_hashtab.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_hdcp.c drm/hdcp: drm_hdcp_request_srm() as static 2019-05-13 22:05:54 +02:00
drm_internal.h Merge remote-tracking branch 'drm/drm-next' into drm-misc-next 2019-05-28 09:39:08 +02:00
drm_ioc32.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_ioctl.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_irq.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_kms_helper_common.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_lease.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_legacy_misc.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_legacy.h drm: make drm_legacy.h self-contained 2019-05-27 18:06:47 +02:00
drm_lock.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_memory.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_mipi_dsi.c
drm_mm.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_mode_config.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_mode_object.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_modes.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_modeset_helper.c
drm_modeset_lock.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_of.c Merge remote-tracking branch 'drm/drm-next' into drm-misc-next 2019-05-28 09:39:08 +02:00
drm_panel_orientation_quirks.c drm: panel-orientation-quirks: Add quirk for GPD MicroPC 2019-06-06 12:49:08 +02:00
drm_panel.c
drm_pci.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_plane_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_plane.c
drm_prime.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_print.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_probe_helper.c drm: Flush output polling on shutdown 2019-06-04 17:11:33 +01:00
drm_property.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_rect.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_scatter.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_scdc_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_simple_kms_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_syncobj.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_sysfs.c Merge remote-tracking branch 'drm/drm-next' into drm-misc-next 2019-05-28 09:39:08 +02:00
drm_trace_points.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_trace.h drm: make drm_trace.h self-contained 2019-05-27 18:06:54 +02:00
drm_vblank.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_vm.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_vma_manager.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_vram_helper_common.c drm: Replace drm_gem_vram_push_to_system() with kunmap + unpin 2019-05-22 12:43:29 +02:00
drm_vram_mm_helper.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
drm_writeback.c drm: drop use of drmP.h in drm/* 2019-05-27 18:07:03 +02:00
Kconfig Merge remote-tracking branch 'drm/drm-next' into drm-misc-next 2019-05-28 09:39:08 +02:00
Makefile drm/fb-helper: Remove drm_fb_helper_crtc 2019-06-04 12:13:47 +02:00