2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2025-01-06 20:53:54 +08:00
linux-next/drivers/gpu/drm
Daniel Vetter 0391359ddf drm/dp-mst: Remove branches before dropping the reference
When we unplug a dp mst branch we unreference the entire tree from
the root towards the leaves. Which is ok, since that's the way the
pointers and so also the refcounts go.

But when we drop the reference we must make sure that we remove the
branches/ports from the lists/pointers before dropping the reference.
Otherwise the get_validated functions will still return it instead
of returning NULL (which indicates a potentially on-going unplug).

The mst branch destroy gets this right for ports: First it deletes
the port from the ports list, then it unrefs. But the ports destroy
function gets it wrong: First it unrefs, then it drops the ref. Which
means a zombie mst branch can still be validate with get_validated_mstb_ref
when it shouldn't.

Fix this.

This should address a backtrace Dave dug out somewhere on unplug:

 [<ffffffffa00cc262>] drm_dp_mst_get_validated_mstb_ref_locked+0x92/0xa0 [drm_kms_helper]
 [<ffffffffa00cc211>] drm_dp_mst_get_validated_mstb_ref_locked+0x41/0xa0 [drm_kms_helper]
 [<ffffffffa00cc2aa>] drm_dp_get_validated_mstb_ref+0x3a/0x60 [drm_kms_helper]
 [<ffffffffa00cc2fb>] drm_dp_payload_send_msg.isra.14+0x2b/0x100 [drm_kms_helper]
 [<ffffffffa00cc547>] drm_dp_update_payload_part1+0x177/0x360 [drm_kms_helper]
 [<ffffffffa015c52e>] intel_mst_disable_dp+0x3e/0x80 [i915]
 [<ffffffffa013d60b>] haswell_crtc_disable+0x1cb/0x340 [i915]
 [<ffffffffa0136739>] intel_crtc_control+0x49/0x100 [i915]
 [<ffffffffa0136857>] intel_crtc_update_dpms+0x67/0x80 [i915]
 [<ffffffffa013fa59>] intel_connector_dpms+0x59/0x70 [i915]
 [<ffffffffa015c752>] intel_dp_destroy_mst_connector+0x32/0xc0 [i915]
 [<ffffffffa00cb44b>] drm_dp_destroy_port+0x6b/0xa0 [drm_kms_helper]
 [<ffffffffa00cb588>] drm_dp_destroy_mst_branch_device+0x108/0x130 [drm_kms_helper]
 [<ffffffffa00cb3cd>] drm_dp_port_teardown_pdt+0x3d/0x50 [drm_kms_helper]
 [<ffffffffa00cdb79>] drm_dp_mst_handle_up_req+0x499/0x540 [drm_kms_helper]
 [<ffffffff810d9ead>] ? trace_hardirqs_on_caller+0x15d/0x200 [<ffffffffa00cdc73>]
 drm_dp_mst_hpd_irq+0x53/0xa00 [drm_kms_helper] [<ffffffffa00c7dfb>]
 ? drm_dp_dpcd_read+0x1b/0x20 [drm_kms_helper] [<ffffffffa0153ed8>]
 ? intel_dp_dpcd_read_wake+0x38/0x70 [i915] [<ffffffffa015a225>]
 intel_dp_check_mst_status+0xb5/0x250 [i915] [<ffffffffa015ac71>]
 intel_dp_hpd_pulse+0x181/0x210 [i915] [<ffffffffa01104f6>]
 i915_digport_work_func+0x96/0x120 [i915]

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
2014-12-09 09:56:45 +10:00
..
amd amdkfd: Disable support for 32-bit user processes 2014-12-05 22:01:35 +02:00
armada Merge tag 'drm-intel-fixes-2014-11-19' into drm-intel-next-queued 2014-11-19 18:17:38 +01:00
ast drm: Move drm_crtc_init from drm_crtc.h to drm_plane_helper.h 2014-11-05 00:14:55 +01:00
bochs bochs: add page_flip 2014-11-20 11:27:31 +10:00
bridge
cirrus drm/cirrus: allow 32bpp framebuffers for cirrus drm 2014-11-20 11:42:46 +10:00
exynos Linux 3.18-rc7 2014-12-02 10:58:33 +10:00
gma500 drm/gma500: add support for atom e6xx lpc lvds i2c 2014-12-02 13:42:49 +10:00
i2c drm: Add adv7511 encoder driver 2014-11-26 20:09:40 +02:00
i810 drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
i915 Linux 3.18 2014-12-08 10:33:52 +10:00
imx drm: imx: Move imx-drm driver out of staging 2014-11-26 09:40:39 +10:00
mga drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
mgag200 drm: Move drm_crtc_init from drm_crtc.h to drm_plane_helper.h 2014-11-05 00:14:55 +01:00
msm drm/msm: switch to atomic-helpers iterator macros 2014-11-27 15:39:09 +01:00
nouveau Linux 3.18 2014-12-08 10:33:52 +10:00
omapdrm drm: omapdrm: remove unused variable 2014-11-20 11:29:39 +10:00
panel drm/panel: Add Sharp LQ101R1SX01 support 2014-11-13 13:56:19 +01:00
qxl drm/ttm: optionally move duplicates to a separate list 2014-12-03 18:26:52 -05:00
r128 drm: remove unnecessary sizeof(u8) 2014-11-20 11:30:37 +10:00
radeon Linux 3.18 2014-12-08 10:33:52 +10:00
rcar-du drm: rcar-du: Fix NULL encoder pointer dereference 2014-12-03 08:28:48 +10:00
rockchip drm: rockchip: Add basic drm driver 2014-12-02 17:29:03 +08:00
savage drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
shmobile drm: Move drm_crtc_init from drm_crtc.h to drm_plane_helper.h 2014-11-05 00:14:55 +01:00
sis drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
sti drm: Move drm_crtc_init from drm_crtc.h to drm_plane_helper.h 2014-11-05 00:14:55 +01:00
tdfx drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
tegra Linux 3.18-rc7 2014-12-02 10:58:33 +10:00
tilcdc drm/tilcdc: Deletion of an unnecessary check before the function call "drm_fbdev_cma_hotplug_event" 2014-11-21 12:16:31 +10:00
ttm drm/ttm: optionally move duplicates to a separate list 2014-12-03 18:26:52 -05:00
udl drm/udl: properly check for error pointers 2014-11-26 10:03:18 +10:00
via drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
vmwgfx drm/ttm: optionally move duplicates to a separate list 2014-12-03 18:26:52 -05:00
ati_pcigart.c drm: split ati_pcigart.h out of drmP.h 2014-09-12 14:11:14 +10:00
drm_agpsupport.c drm: move AGP definitions harder 2014-09-10 17:40:11 +10:00
drm_atomic_helper.c drm/atomic: clear plane's CRTC and FB when shutting down 2014-11-27 15:39:11 +01:00
drm_atomic.c drm/atomic: track bitmask of planes attached to crtc 2014-11-27 15:38:15 +01:00
drm_auth.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_bufs.c drm: Move __drm_pci_free to drm_legacy.h 2014-09-12 11:08:56 +02:00
drm_cache.c
drm_context.c
drm_crtc_helper.c drm/atomic: Refcounting for plane_state->fb 2014-11-06 21:08:37 +01:00
drm_crtc_internal.h
drm_crtc.c drm: Handle atomic state properly in kms getfoo ioctl 2014-11-27 15:39:11 +01:00
drm_debugfs.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_dma.c drm: Move legacy buffer structures to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_dp_helper.c drm/dp: retry AUX transactions 32 times (v1.1) 2014-12-09 09:56:44 +10:00
drm_dp_mst_topology.c drm/dp-mst: Remove branches before dropping the reference 2014-12-09 09:56:45 +10:00
drm_drv.c drm: Document that drm_dev_alloc doesn't need a parent 2014-11-25 13:12:42 +01:00
drm_edid_load.c drm/edid: Deletion of an unnecessary check before the function call "release_firmware" 2014-11-21 12:16:27 +10:00
drm_edid.c Merge tag 'drm-intel-next-2014-11-21-fixed' of git://anongit.freedesktop.org/drm-intel into drm-next 2014-12-03 08:25:59 +10:00
drm_encoder_slave.c
drm_fb_cma_helper.c
drm_fb_helper.c drm/fb_helper: move deferred fb checking into restore mode (v2) 2014-12-09 09:56:45 +10:00
drm_flip_work.c drm: flip-work: change drm_flip_work_init prototype 2014-11-15 09:29:14 +10:00
drm_fops.c drm: Implement O_NONBLOCK support on /dev/dri/cardN 2014-10-08 15:07:07 +02:00
drm_gem_cma_helper.c drm/cma: Remove call to drm_gem_free_mmap_offset() 2014-11-13 13:27:33 +01:00
drm_gem.c drm: Sanitize DRM_IOCTL_MODE_CREATE_DUMB input 2014-11-15 09:50:21 +10:00
drm_global.c
drm_hashtab.c
drm_info.c drm: Extract <drm/drm_gem.h> 2014-09-24 11:43:41 +10:00
drm_internal.h drm: Move internal debugfs functions to drm_internal.h 2014-09-24 11:43:35 +10:00
drm_ioc32.c
drm_ioctl.c drm: Purge ioctl forward declarations from drmP.h 2014-09-12 15:27:47 +02:00
drm_irq.c drm/irq: BUG_ON() -> WARN_ON() 2014-11-20 11:33:51 +10:00
drm_legacy.h drm: Create drm legacy driver header 2014-09-12 11:08:55 +02:00
drm_lock.c drm: unexport drm_global_mutex 2014-09-12 11:19:47 +02:00
drm_memory.c drm: Move drm_memory.c map support declarations to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_mipi_dsi.c drm/dsi: Do not require .owner field to be set 2014-11-13 13:56:17 +01:00
drm_mm.c
drm_modes.c gpu:drm: Fix typo in Documentation/DocBook/drm.xml 2014-10-21 10:55:33 +02:00
drm_modeset_lock.c drm: Per-plane locking 2014-11-12 17:56:12 +10:00
drm_of.c
drm_panel.c
drm_pci.c drm: Move legacy buffer structures to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_plane_helper.c drm/plane: Pass old state to ->atomic_update() 2014-11-25 13:27:58 +01:00
drm_platform.c drm: Goody bye, drm_bus! 2014-09-10 17:43:10 +10:00
drm_prime.c drm: Miscellaneous fixes for v3.19-rc1 2014-11-15 09:37:20 +10:00
drm_probe_helper.c drm: Fix DRM_FORCE_ON_DIGITAL use 2014-11-04 09:45:04 +01:00
drm_rect.c
drm_scatter.c drm: Move sg functions into drm_legacy.h 2014-09-12 11:08:54 +02:00
drm_sysfs.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_trace_points.c
drm_trace.h
drm_vm.c drm: Move drm_vm_open_locked into drm_internal.h 2014-09-24 11:43:20 +10:00
drm_vma_manager.c
Kconfig Merge branch 'drm_iommu_v15' of https://github.com/markyzq/kernel-drm-rockchip into drm-next 2014-12-08 13:45:18 +10:00
Makefile Merge branch 'drm_iommu_v15' of https://github.com/markyzq/kernel-drm-rockchip into drm-next 2014-12-08 13:45:18 +10:00