[PATCH] drm/atomic-helper: Do not assume vblank is always present
Martin Krastev (VMware)
martinkrastev768 at gmail.com
Wed Apr 5 12:49:55 UTC 2023
From: Martin Krastev <krastevm at vmware.com>
LGTM!
Reviewed-by: Martin Krastev <krastevm at vmware.com>
Regards,
Martin
On 5.04.23 г. 7:56 ч., Zack Rusin wrote:
> From: Zack Rusin <zackr at vmware.com>
>
> Many drivers (in particular all of the virtualized drivers) do not
> implement vblank handling. Assuming vblank is always present
> leads to crashes.
>
> Fix the crashes by making sure the device supports vblank before using
> it.
>
> Fixes crashes on boot, as in:
> Oops: 0000 [#1] PREEMPT SMP PTI
> CPU: 0 PID: 377 Comm: systemd-modules Not tainted 6.3.0-rc4-vmwgfx #1
> Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020
> RIP: 0010:drm_crtc_next_vblank_start+0x2c/0x80 [drm]
> Code: 1e fa 0f 1f 44 00 00 8b 87 90 00 00 00 48 8b 17 55 48 8d 0c c0 48 89 e5 41 54 53 48 8d 1c 48 48 c1 e3 04 48 03 9a 40 01 00 00 <8b> 53 74 85 d2 74 3f 8b 4>
> RSP: 0018:ffffb825004073c8 EFLAGS: 00010246
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> RDX: ffff9b18cf8d0000 RSI: ffffb825004073e8 RDI: ffff9b18d0f40000
> RBP: ffffb825004073d8 R08: ffff9b18cf8d0000 R09: 0000000000000000
> R10: ffff9b18c57ef6e8 R11: ffff9b18c2d59e00 R12: 0000000000000000
> R13: ffff9b18cfa99280 R14: 0000000000000000 R15: ffff9b18cf8d0000
> FS: 00007f2b82538900(0000) GS:ffff9b19f7c00000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000074 CR3: 00000001060a6003 CR4: 00000000003706f0
> Call Trace:
> <TASK>
> drm_atomic_helper_wait_for_fences+0x87/0x1e0 [drm_kms_helper]
> drm_atomic_helper_commit+0xa1/0x160 [drm_kms_helper]
> drm_atomic_commit+0x9a/0xd0 [drm]
> ? __pfx___drm_printfn_info+0x10/0x10 [drm]
> drm_client_modeset_commit_atomic+0x1e9/0x230 [drm]
> drm_client_modeset_commit_locked+0x5f/0x160 [drm]
> ? mutex_lock+0x17/0x50
> drm_client_modeset_commit+0x2b/0x50 [drm]
> __drm_fb_helper_restore_fbdev_mode_unlocked+0xca/0x100 [drm_kms_helper]
> drm_fb_helper_set_par+0x40/0x80 [drm_kms_helper]
> fbcon_init+0x2c5/0x690
> visual_init+0xee/0x190
> do_bind_con_driver.isra.0+0x1ce/0x4b0
> do_take_over_console+0x136/0x220
> ? vprintk_default+0x21/0x30
> do_fbcon_takeover+0x78/0x130
> do_fb_registered+0x139/0x270
> fbcon_fb_registered+0x3b/0x90
> ? fb_add_videomode+0x81/0xf0
> register_framebuffer+0x22f/0x330
> __drm_fb_helper_initial_config_and_unlock+0x349/0x520 [drm_kms_helper]
> ? kmalloc_large+0x25/0xc0
> drm_fb_helper_initial_config+0x3f/0x50 [drm_kms_helper]
> drm_fbdev_generic_client_hotplug+0x73/0xc0 [drm_kms_helper]
> drm_fbdev_generic_setup+0x99/0x170 [drm_kms_helper]
>
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> Fixes: d39e48ca80c0 ("drm/atomic-helper: Set fence deadline for vblank")
> Cc: Rob Clark <robdclark at chromium.org>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/drm_vblank.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
> index 299fa2a19a90..6438aeb1c65f 100644
> --- a/drivers/gpu/drm/drm_vblank.c
> +++ b/drivers/gpu/drm/drm_vblank.c
> @@ -997,12 +997,16 @@ int drm_crtc_next_vblank_start(struct drm_crtc *crtc, ktime_t *vblanktime)
> {
> unsigned int pipe = drm_crtc_index(crtc);
> struct drm_vblank_crtc *vblank = &crtc->dev->vblank[pipe];
> - struct drm_display_mode *mode = &vblank->hwmode;
> + struct drm_display_mode *mode;
> u64 vblank_start;
>
> + if (!drm_dev_has_vblank(crtc->dev))
> + return -EINVAL;
> +
> if (!vblank->framedur_ns || !vblank->linedur_ns)
> return -EINVAL;
>
> + mode = &vblank->hwmode;
> if (!drm_crtc_get_last_vbltimestamp(crtc, vblanktime, false))
> return -EINVAL;
>
More information about the dri-devel
mailing list