drm/atomic: If the atomic check fails, return its value first
commit
a0ffc51e20e90e0c1c2491de2b4b03f48b6caaba upstream.
The last part of drm_atomic_check_only is testing whether we need to
fail with -EINVAL when modeset is not allowed, but forgets to return
the value when atomic_check() fails first.
This results in -EDEADLK being replaced by -EINVAL, and the sanity
check in drm_modeset_drop_locks kicks in:
[ 308.531734] ------------[ cut here ]------------
[ 308.531791] WARNING: CPU: 0 PID: 1886 at drivers/gpu/drm/drm_modeset_lock.c:217 drm_modeset_drop_locks+0x33/0xc0 [drm]
[ 308.531828] Modules linked in:
[ 308.532050] CPU: 0 PID: 1886 Comm: kms_atomic Tainted: G U W 4.13.0-rc5-patser+ #5225
[ 308.532082] Hardware name: NUC5i7RYB, BIOS RYBDWi35.86A.0246.2015.0309.1355 03/09/2015
[ 308.532124] task:
ffff8800cd9dae00 task.stack:
ffff8800ca3b8000
[ 308.532168] RIP: 0010:drm_modeset_drop_locks+0x33/0xc0 [drm]
[ 308.532189] RSP: 0018:
ffff8800ca3bf980 EFLAGS:
00010282
[ 308.532211] RAX:
dffffc0000000000 RBX:
ffff8800ca3bfaf8 RCX:
0000000013a171e6
[ 308.532235] RDX:
1ffff10019477f69 RSI:
ffffffffa8ba4fa0 RDI:
ffff8800ca3bfb48
[ 308.532258] RBP:
ffff8800ca3bf998 R08:
0000000000000000 R09:
0000000000000003
[ 308.532281] R10:
0000000079dbe066 R11:
00000000f760b34b R12:
0000000000000001
[ 308.532304] R13:
dffffc0000000000 R14:
00000000ffffffea R15:
ffff880096889680
[ 308.532328] FS:
00007ff00959cec0(0000) GS:
ffff8800d4e00000(0000) knlGS:
0000000000000000
[ 308.532359] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 308.532380] CR2:
0000000000000008 CR3:
00000000ca2e3000 CR4:
00000000003406f0
[ 308.532402] Call Trace:
[ 308.532440] drm_mode_atomic_ioctl+0x19fa/0x1c00 [drm]
[ 308.532488] ? drm_atomic_set_property+0x1220/0x1220 [drm]
[ 308.532565] ? avc_has_extended_perms+0xc39/0xff0
[ 308.532593] ? lock_downgrade+0x610/0x610
[ 308.532640] ? drm_atomic_set_property+0x1220/0x1220 [drm]
[ 308.532680] drm_ioctl_kernel+0x154/0x1a0 [drm]
[ 308.532755] drm_ioctl+0x624/0x8f0 [drm]
[ 308.532858] ? drm_atomic_set_property+0x1220/0x1220 [drm]
[ 308.532976] ? drm_getunique+0x210/0x210 [drm]
[ 308.533061] do_vfs_ioctl+0xd92/0xe40
[ 308.533121] ? ioctl_preallocate+0x1b0/0x1b0
[ 308.533160] ? selinux_capable+0x20/0x20
[ 308.533191] ? do_fcntl+0x1b1/0xbf0
[ 308.533219] ? kasan_slab_free+0xa2/0xb0
[ 308.533249] ? f_getown+0x4b/0xa0
[ 308.533278] ? putname+0xcf/0xe0
[ 308.533309] ? security_file_ioctl+0x57/0x90
[ 308.533342] SyS_ioctl+0x4e/0x80
[ 308.533374] entry_SYSCALL_64_fastpath+0x18/0xad
[ 308.533405] RIP: 0033:0x7ff00779e4d7
[ 308.533431] RSP: 002b:
00007fff66a043d8 EFLAGS:
00000246 ORIG_RAX:
0000000000000010
[ 308.533481] RAX:
ffffffffffffffda RBX:
000000e7c7ca5910 RCX:
00007ff00779e4d7
[ 308.533560] RDX:
00007fff66a04430 RSI:
00000000c03864bc RDI:
0000000000000003
[ 308.533608] RBP:
00007ff007a5fb00 R08:
000000e7c7ca4620 R09:
000000e7c7ca5e60
[ 308.533647] R10:
0000000000000001 R11:
0000000000000246 R12:
0000000000000070
[ 308.533685] R13:
0000000000000000 R14:
0000000000000000 R15:
000000e7c7ca5930
[ 308.533770] Code: ff df 55 48 89 e5 41 55 41 54 53 48 89 fb 48 83 c7
50 48 89 fa 48 c1 ea 03 80 3c 02 00 74 05 e8 94 d4 16 e7 48 83 7b 50 00
74 02 <0f> ff 4c 8d 6b 58 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1
[ 308.534086] ---[ end trace
77f11e53b1df44ad ]---
Solve this by adding the missing return.
This is also a bugfix because we could end up rejecting updates with
-EINVAL because of a early -EDEADLK, while if atomic_check ran to
completion it might have downgraded the modeset to a fastset.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Testcase: kms_atomic
Link: https://patchwork.freedesktop.org/patch/msgid/20170815095706.23624-1-maarten.lankhorst@linux.intel.com
Fixes:
d34f20d6e2f2 ("drm: Atomic modeset ioctl")
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>