From: Mark Yao Date: Wed, 2 Aug 2017 01:48:43 +0000 (+0800) Subject: drm/rockchip: vop: reference vblank before queue to flip worker X-Git-Tag: release-20171130_firefly~4^2~50 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1089d618633f245fba1ede6f55eae6eabd8071d0;p=firefly-linux-kernel-4.4.55.git drm/rockchip: vop: reference vblank before queue to flip worker Reference vblank after the fb_unref_worker may have a problem: queue fb_unref_work <--- unfer_worker:drm_crtc_vblank_put() drm_crtc_vblank_get Following Warning may cause by this race: [11749.638812] WARNING: at drivers/gpu/drm/drm_irq.c:1272 [11749.638818] Modules linked in: [11749.638825] [11749.638833] CPU: 4 PID: 8446 Comm: kworker/u12:1 Not tainted 4.4.77 #2428 [11749.638841] Hardware name: Rockchip RK3399 Excavator Board edp (Android) (DT) [11749.638864] Workqueue: events_unbound flip_worker [11749.638873] task: ffffffc0f1a7db00 ti: ffffffc0da3f8000 task.ti: ffffffc0da3f8000 [11749.638884] PC is at drm_vblank_put+0x34/0xac [11749.638890] LR is at drm_crtc_vblank_put+0x20/0x2c [11749.642771] [] drm_vblank_put+0x34/0xac [11749.642778] [] drm_crtc_vblank_put+0x20/0x2c [11749.642786] [] vop_fb_unref_worker+0x14/0x28 [11749.642792] [] flip_worker+0xa8/0xe8 [11749.642801] [] process_one_work+0x218/0x3e0 [11749.642808] [] worker_thread+0x2e8/0x404 [11749.642814] [] kthread+0xf8/0x100 [11749.642821] [] ret_from_fork+0x10/0x50 Change-Id: I2b7f8a84d18e4635122b5028d39ec8192c6ca70b Signed-off-by: Mark Yao --- diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 4549fcfec448..7b4e9ac48956 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -2323,9 +2323,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, continue; drm_framebuffer_reference(old_plane_state->fb); + WARN_ON(drm_crtc_vblank_get(crtc) != 0); drm_flip_work_queue(&vop->fb_unref_work, old_plane_state->fb); set_bit(VOP_PENDING_FB_UNREF, &vop->pending); - WARN_ON(drm_crtc_vblank_get(crtc) != 0); } }