linux/drivers/gpu/drm/nouveau/dispnv50
Lyude Paul 412e85b605 drm/nouveau: Only release VCPI slots on mode changes
Looks like a regression got introduced into nv50_mstc_atomic_check()
that somehow didn't get found until now. If userspace changes
crtc_state->active to false but leaves the CRTC enabled, we end up
calling drm_dp_atomic_find_vcpi_slots() using the PBN calculated in
asyh->dp.pbn. However, if the display is inactive we end up calculating
a PBN of 0, which inadvertently causes us to have an allocation of 0.
>From there, if userspace then disables the CRTC afterwards we end up
accidentally attempting to free the VCPI twice:

WARNING: CPU: 0 PID: 1484 at drivers/gpu/drm/drm_dp_mst_topology.c:3336
drm_dp_atomic_release_vcpi_slots+0x87/0xb0 [drm_kms_helper]
RIP: 0010:drm_dp_atomic_release_vcpi_slots+0x87/0xb0 [drm_kms_helper]
Call Trace:
 drm_atomic_helper_check_modeset+0x3f3/0xa60 [drm_kms_helper]
 ? drm_atomic_check_only+0x43/0x780 [drm]
 drm_atomic_helper_check+0x15/0x90 [drm_kms_helper]
 nv50_disp_atomic_check+0x83/0x1d0 [nouveau]
 drm_atomic_check_only+0x54d/0x780 [drm]
 ? drm_atomic_set_crtc_for_connector+0xec/0x100 [drm]
 drm_atomic_commit+0x13/0x50 [drm]
 drm_atomic_helper_set_config+0x81/0x90 [drm_kms_helper]
 drm_mode_setcrtc+0x194/0x6a0 [drm]
 ? vprintk_emit+0x16a/0x230
 ? drm_ioctl+0x163/0x390 [drm]
 ? drm_mode_getcrtc+0x180/0x180 [drm]
 drm_ioctl_kernel+0xaa/0xf0 [drm]
 drm_ioctl+0x208/0x390 [drm]
 ? drm_mode_getcrtc+0x180/0x180 [drm]
 nouveau_drm_ioctl+0x63/0xb0 [nouveau]
 do_vfs_ioctl+0x405/0x660
 ? recalc_sigpending+0x17/0x50
 ? _copy_from_user+0x37/0x60
 ksys_ioctl+0x5e/0x90
 ? exit_to_usermode_loop+0x92/0xe0
 __x64_sys_ioctl+0x16/0x20
 do_syscall_64+0x59/0x190
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
WARNING: CPU: 0 PID: 1484 at drivers/gpu/drm/drm_dp_mst_topology.c:3336
drm_dp_atomic_release_vcpi_slots+0x87/0xb0 [drm_kms_helper]
---[ end trace 4c395c0c51b1f88d ]---
[drm:drm_dp_atomic_release_vcpi_slots [drm_kms_helper]] *ERROR* no VCPI for
[MST PORT:00000000e288eb7d] found in mst state 000000008e642070

So, fix this by doing what we probably should have done from the start: only
call drm_dp_atomic_find_vcpi_slots() when crtc_state->mode_changed is set, so
that VCPI allocations remain for as long as the CRTC is enabled.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Fixes: 232c9eec41 ("drm/nouveau: Use atomic VCPI helpers for MST")
Cc: Lyude Paul <lyude@redhat.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: David Airlie <airlied@redhat.com>
Cc: Jerry Zuo <Jerry.Zuo@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Juston Li <juston.li@intel.com>
Cc: Karol Herbst <karolherbst@gmail.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: <stable@vger.kernel.org> # v5.1+
Acked-by: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190801220216.15323-1-lyude@redhat.com
2019-08-02 09:49:37 +10:00
..
atom.h drm/nouveau: Move PBN and VCPI allocation into nv50_head_atom 2019-02-05 18:19:44 -05:00
base507c.c
base827c.c
base907c.c drm/nouveau/kms/nv50-: allow more flexibility with lut formats 2018-12-11 15:37:49 +10:00
base917c.c
base.c
base.h
core507d.c
core827d.c
core907d.c
core917d.c
core.c drm/nouveau/disp/tu102: rename implementation from tu104 2019-02-20 08:59:58 +10:00
core.h drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
corec37d.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
corec57d.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
curs507a.c
curs907a.c
curs.c drm/nouveau/disp/tu102: rename implementation from tu104 2019-02-20 08:59:58 +10:00
curs.h
cursc37a.c
dac507d.c
dac907d.c
disp.c drm/nouveau: Only release VCPI slots on mode changes 2019-08-02 09:49:37 +10:00
disp.h drm/nouveau/kms/gv100-: fix spurious window immediate interlocks 2019-05-14 16:58:05 +10:00
head507d.c drm/nouveau/kms/nv50-: allow more flexibility with lut formats 2018-12-11 15:37:49 +10:00
head827d.c
head907d.c drm/nouveau/kms/nv50-: allow more flexibility with lut formats 2018-12-11 15:37:49 +10:00
head917d.c
head.c drm/nouveau/disp/nv50-: fix center/aspect-corrected scaling 2019-07-19 16:26:50 +10:00
head.h drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
headc37d.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
headc57d.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
Kbuild drm/nouveau: fix bogus GPL-2 license header 2019-07-19 16:26:51 +10:00
lut.c drm/nouveau/kms/nv50-: allow more flexibility with lut formats 2018-12-11 15:37:49 +10:00
lut.h drm/nouveau/kms/nv50-: allow more flexibility with lut formats 2018-12-11 15:37:49 +10:00
oimm507b.c
oimm.c
oimm.h
ovly507e.c
ovly827e.c
ovly907e.c
ovly917e.c
ovly.c
ovly.h
pior507d.c
sor507d.c
sor907d.c
sorc37d.c
wimm.c drm/nouveau/disp/tu102: rename implementation from tu104 2019-02-20 08:59:58 +10:00
wimm.h
wimmc37b.c drm/nouveau/kms/gv100-: fix spurious window immediate interlocks 2019-05-14 16:58:05 +10:00
wndw.c drm/nouveau/kms/nv50-: fix bug preventing non-vsync'd page flips 2019-05-14 16:58:06 +10:00
wndw.h drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
wndwc37e.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00
wndwc57e.c drm/nouveau/kms/tu104: initial support 2018-12-11 15:37:55 +10:00