Re: [PATCH] drm/rockchip: fix VOP vblank race
Applied to drm-misc-next. Thanks! 在 2018/4/17 5:43, Heiko Stuebner 写道: Hi John, Am Montag, 16. April 2018, 18:46:56 CEST schrieb John Keeping: Hi Sandy, On Tue, 10 Apr 2018 20:40:06 +0800, Sandy Huang wrote: Reviewed-by: Sandy huangThanks for the review, but I don't see this in drm-misc yet. Are you planning to pick this up? I was occupied with merge-window stuff recently, but I guess either Sandy or myself is going to pick it up shortly. Heiko 在 2018/3/29 0:03, John Keeping 写道: We have seen a case of a bad reference count for vblanks with the Rockchip VOP: [ cut here ] WARNING: CPU: 1 PID: 383 at drivers/gpu/drm/drm_irq.c:1198 drm_vblank_put+0x40/0xcc Modules linked in: brcmfmac brcmutil CPU: 1 PID: 383 Comm: kworker/u8:2 Not tainted 4.9.75-rt60 #1 Hardware name: Rockchip (Device Tree) Workqueue: events_unbound flip_worker Backtrace: [] (dump_backtrace) from [] (show_stack+0x18/0x1c) r7:c0b1b13c r6:600b0013 r5: r4:c0b1b13c [] (show_stack) from [] (dump_stack+0x78/0x94) [] (dump_stack) from [] (__warn+0xe4/0x104) r7:0009 r6:c03cf26c r5: r4: [] (__warn) from [] (warn_slowpath_null+0x28/0x30) r9:eeb443a0 r8:eeb443c8 r7:ee8a5ec0 r6:ee8a5ec0 r5:edb47f00 r4:ee096200 [] (warn_slowpath_null) from [] (drm_vblank_put+0x40/0xcc) [] (drm_vblank_put) from [] (drm_crtc_vblank_put+0x18/0x1c) r5:edb47f00 r4:ee3c8a80 [] (drm_crtc_vblank_put) from [] (vop_fb_unref_worker+0x18/0x24) [] (vop_fb_unref_worker) from [] (flip_worker+0x98/0xb4) r5:edb47f00 r4:eeb443a8 [] (flip_worker) from [] (process_one_work+0x1a8/0x2fc) r9: r8:ee807d00 r7: r6:ee809c00 r5:eeb443a8 r4:edfe5f80 [] (process_one_work) from [] (worker_thread+0x2ac/0x458) r10:0088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 r5:ee809c00 r4:edfe5f80 [] (worker_thread) from [] (kthread+0xfc/0x10c) r10: r9: r8:c0135640 r7:edfe5f80 r6: r5:edf0e240 r4:ee8a4000 r3:ed194e00 [] (kthread) from [] (ret_from_fork+0x14/0x3c) r8: r7: r6: r5:c0139fc0 r4:edf0e240 ---[ end trace 0002 ]--- It seems that this is caused by unfortunate timing between vop_crtc_atomic_flush() and vop_handle_vblank() given the following ordering: atomic_flushhandle_vblank - drm_flip_work_queue set_bit if (test_and_clear_bit(...)) drm_flip_work_commit drm_vblank_get This results in vop_fb_unref_worker (called as flip work) decrementing the vblank refcount before it has been incremented. Signed-off-by: John Keeping --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 6755a9eea4b2..d4e1400aedf3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1017,9 +1017,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, continue; drm_framebuffer_get(old_plane_state->fb); + WARN_ON(drm_crtc_vblank_get(crtc) != 0); drm_flip_work_queue(>fb_unref_work, old_plane_state->fb); set_bit(VOP_PENDING_FB_UNREF, >pending); - WARN_ON(drm_crtc_vblank_get(crtc) != 0); } } ___ Linux-rockchip mailing list linux-rockc...@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-rockchip ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH] drm/rockchip: fix VOP vblank race
Hi John, Am Montag, 16. April 2018, 18:46:56 CEST schrieb John Keeping: > Hi Sandy, > > On Tue, 10 Apr 2018 20:40:06 +0800, Sandy Huang wrote: > > > Reviewed-by: Sandy huang> > Thanks for the review, but I don't see this in drm-misc yet. Are you > planning to pick this up? I was occupied with merge-window stuff recently, but I guess either Sandy or myself is going to pick it up shortly. Heiko > > 在 2018/3/29 0:03, John Keeping 写道: > > > We have seen a case of a bad reference count for vblanks with the > > > Rockchip VOP: > > > > > > [ cut here ] > > > WARNING: CPU: 1 PID: 383 at drivers/gpu/drm/drm_irq.c:1198 > > > drm_vblank_put+0x40/0xcc > > > Modules linked in: brcmfmac brcmutil > > > CPU: 1 PID: 383 Comm: kworker/u8:2 Not tainted 4.9.75-rt60 #1 > > > Hardware name: Rockchip (Device Tree) > > > Workqueue: events_unbound flip_worker > > > Backtrace: > > > [] (dump_backtrace) from [] (show_stack+0x18/0x1c) > > >r7:c0b1b13c r6:600b0013 r5: r4:c0b1b13c > > > [] (show_stack) from [] (dump_stack+0x78/0x94) > > > [] (dump_stack) from [] (__warn+0xe4/0x104) > > >r7:0009 r6:c03cf26c r5: r4: > > > [] (__warn) from [] (warn_slowpath_null+0x28/0x30) > > >r9:eeb443a0 r8:eeb443c8 r7:ee8a5ec0 r6:ee8a5ec0 r5:edb47f00 r4:ee096200 > > > [] (warn_slowpath_null) from [] > > > (drm_vblank_put+0x40/0xcc) > > > [] (drm_vblank_put) from [] > > > (drm_crtc_vblank_put+0x18/0x1c) > > >r5:edb47f00 r4:ee3c8a80 > > > [] (drm_crtc_vblank_put) from [] > > > (vop_fb_unref_worker+0x18/0x24) > > > [] (vop_fb_unref_worker) from [] > > > (flip_worker+0x98/0xb4) > > >r5:edb47f00 r4:eeb443a8 > > > [] (flip_worker) from [] > > > (process_one_work+0x1a8/0x2fc) > > >r9: r8:ee807d00 r7: r6:ee809c00 r5:eeb443a8 r4:edfe5f80 > > > [] (process_one_work) from [] > > > (worker_thread+0x2ac/0x458) > > >r10:0088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 > > > r5:ee809c00 > > >r4:edfe5f80 > > > [] (worker_thread) from [] (kthread+0xfc/0x10c) > > >r10: r9: r8:c0135640 r7:edfe5f80 r6: > > > r5:edf0e240 > > >r4:ee8a4000 r3:ed194e00 > > > [] (kthread) from [] (ret_from_fork+0x14/0x3c) > > >r8: r7: r6: r5:c0139fc0 r4:edf0e240 > > > ---[ end trace 0002 ]--- > > > > > > It seems that this is caused by unfortunate timing between > > > vop_crtc_atomic_flush() and vop_handle_vblank() given the following > > > ordering: > > > > > > atomic_flushhandle_vblank > > > - > > > > > > drm_flip_work_queue > > > set_bit > > > if (test_and_clear_bit(...)) > > > drm_flip_work_commit > > > drm_vblank_get > > > > > > This results in vop_fb_unref_worker (called as flip work) decrementing > > > the vblank refcount before it has been incremented. > > > > > > Signed-off-by: John Keeping > > > --- > > > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > > b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > > index 6755a9eea4b2..d4e1400aedf3 100644 > > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > > @@ -1017,9 +1017,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc > > > *crtc, > > > continue; > > > > > > drm_framebuffer_get(old_plane_state->fb); > > > + WARN_ON(drm_crtc_vblank_get(crtc) != 0); > > > drm_flip_work_queue(>fb_unref_work, > > > old_plane_state->fb); > > > set_bit(VOP_PENDING_FB_UNREF, >pending); > > > - WARN_ON(drm_crtc_vblank_get(crtc) != 0); > > > } > > > } > > > > > > > > ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH] drm/rockchip: fix VOP vblank race
Hi Sandy, On Tue, 10 Apr 2018 20:40:06 +0800, Sandy Huang wrote: > Reviewed-by: Sandy huangThanks for the review, but I don't see this in drm-misc yet. Are you planning to pick this up? > 在 2018/3/29 0:03, John Keeping 写道: > > We have seen a case of a bad reference count for vblanks with the > > Rockchip VOP: > > > > [ cut here ] > > WARNING: CPU: 1 PID: 383 at drivers/gpu/drm/drm_irq.c:1198 > > drm_vblank_put+0x40/0xcc > > Modules linked in: brcmfmac brcmutil > > CPU: 1 PID: 383 Comm: kworker/u8:2 Not tainted 4.9.75-rt60 #1 > > Hardware name: Rockchip (Device Tree) > > Workqueue: events_unbound flip_worker > > Backtrace: > > [] (dump_backtrace) from [] (show_stack+0x18/0x1c) > > r7:c0b1b13c r6:600b0013 r5: r4:c0b1b13c > > [] (show_stack) from [] (dump_stack+0x78/0x94) > > [] (dump_stack) from [] (__warn+0xe4/0x104) > > r7:0009 r6:c03cf26c r5: r4: > > [] (__warn) from [] (warn_slowpath_null+0x28/0x30) > > r9:eeb443a0 r8:eeb443c8 r7:ee8a5ec0 r6:ee8a5ec0 r5:edb47f00 r4:ee096200 > > [] (warn_slowpath_null) from [] > > (drm_vblank_put+0x40/0xcc) > > [] (drm_vblank_put) from [] > > (drm_crtc_vblank_put+0x18/0x1c) > > r5:edb47f00 r4:ee3c8a80 > > [] (drm_crtc_vblank_put) from [] > > (vop_fb_unref_worker+0x18/0x24) > > [] (vop_fb_unref_worker) from [] > > (flip_worker+0x98/0xb4) > > r5:edb47f00 r4:eeb443a8 > > [] (flip_worker) from [] > > (process_one_work+0x1a8/0x2fc) > > r9: r8:ee807d00 r7: r6:ee809c00 r5:eeb443a8 r4:edfe5f80 > > [] (process_one_work) from [] > > (worker_thread+0x2ac/0x458) > > r10:0088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 > > r5:ee809c00 > > r4:edfe5f80 > > [] (worker_thread) from [] (kthread+0xfc/0x10c) > > r10: r9: r8:c0135640 r7:edfe5f80 r6: > > r5:edf0e240 > > r4:ee8a4000 r3:ed194e00 > > [] (kthread) from [] (ret_from_fork+0x14/0x3c) > > r8: r7: r6: r5:c0139fc0 r4:edf0e240 > > ---[ end trace 0002 ]--- > > > > It seems that this is caused by unfortunate timing between > > vop_crtc_atomic_flush() and vop_handle_vblank() given the following > > ordering: > > > > atomic_flushhandle_vblank > > - > > > > drm_flip_work_queue > > set_bit > > if (test_and_clear_bit(...)) > > drm_flip_work_commit > > drm_vblank_get > > > > This results in vop_fb_unref_worker (called as flip work) decrementing > > the vblank refcount before it has been incremented. > > > > Signed-off-by: John Keeping > > --- > > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > index 6755a9eea4b2..d4e1400aedf3 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > > @@ -1017,9 +1017,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc > > *crtc, > > continue; > > > > drm_framebuffer_get(old_plane_state->fb); > > + WARN_ON(drm_crtc_vblank_get(crtc) != 0); > > drm_flip_work_queue(>fb_unref_work, old_plane_state->fb); > > set_bit(VOP_PENDING_FB_UNREF, >pending); > > - WARN_ON(drm_crtc_vblank_get(crtc) != 0); > > } > > } > > > > ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH] drm/rockchip: fix VOP vblank race
Reviewed-by: Sandy huang在 2018/3/29 0:03, John Keeping 写道: We have seen a case of a bad reference count for vblanks with the Rockchip VOP: [ cut here ] WARNING: CPU: 1 PID: 383 at drivers/gpu/drm/drm_irq.c:1198 drm_vblank_put+0x40/0xcc Modules linked in: brcmfmac brcmutil CPU: 1 PID: 383 Comm: kworker/u8:2 Not tainted 4.9.75-rt60 #1 Hardware name: Rockchip (Device Tree) Workqueue: events_unbound flip_worker Backtrace: [] (dump_backtrace) from [] (show_stack+0x18/0x1c) r7:c0b1b13c r6:600b0013 r5: r4:c0b1b13c [] (show_stack) from [] (dump_stack+0x78/0x94) [] (dump_stack) from [] (__warn+0xe4/0x104) r7:0009 r6:c03cf26c r5: r4: [] (__warn) from [] (warn_slowpath_null+0x28/0x30) r9:eeb443a0 r8:eeb443c8 r7:ee8a5ec0 r6:ee8a5ec0 r5:edb47f00 r4:ee096200 [] (warn_slowpath_null) from [] (drm_vblank_put+0x40/0xcc) [] (drm_vblank_put) from [] (drm_crtc_vblank_put+0x18/0x1c) r5:edb47f00 r4:ee3c8a80 [] (drm_crtc_vblank_put) from [] (vop_fb_unref_worker+0x18/0x24) [] (vop_fb_unref_worker) from [] (flip_worker+0x98/0xb4) r5:edb47f00 r4:eeb443a8 [] (flip_worker) from [] (process_one_work+0x1a8/0x2fc) r9: r8:ee807d00 r7: r6:ee809c00 r5:eeb443a8 r4:edfe5f80 [] (process_one_work) from [] (worker_thread+0x2ac/0x458) r10:0088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 r5:ee809c00 r4:edfe5f80 [] (worker_thread) from [] (kthread+0xfc/0x10c) r10: r9: r8:c0135640 r7:edfe5f80 r6: r5:edf0e240 r4:ee8a4000 r3:ed194e00 [] (kthread) from [] (ret_from_fork+0x14/0x3c) r8: r7: r6: r5:c0139fc0 r4:edf0e240 ---[ end trace 0002 ]--- It seems that this is caused by unfortunate timing between vop_crtc_atomic_flush() and vop_handle_vblank() given the following ordering: atomic_flushhandle_vblank - drm_flip_work_queue set_bit if (test_and_clear_bit(...)) drm_flip_work_commit drm_vblank_get This results in vop_fb_unref_worker (called as flip work) decrementing the vblank refcount before it has been incremented. Signed-off-by: John Keeping --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 6755a9eea4b2..d4e1400aedf3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1017,9 +1017,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, continue; drm_framebuffer_get(old_plane_state->fb); + WARN_ON(drm_crtc_vblank_get(crtc) != 0); drm_flip_work_queue(>fb_unref_work, old_plane_state->fb); set_bit(VOP_PENDING_FB_UNREF, >pending); - WARN_ON(drm_crtc_vblank_get(crtc) != 0); } } ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH] drm/rockchip: fix VOP vblank race
We have seen a case of a bad reference count for vblanks with the Rockchip VOP: [ cut here ] WARNING: CPU: 1 PID: 383 at drivers/gpu/drm/drm_irq.c:1198 drm_vblank_put+0x40/0xcc Modules linked in: brcmfmac brcmutil CPU: 1 PID: 383 Comm: kworker/u8:2 Not tainted 4.9.75-rt60 #1 Hardware name: Rockchip (Device Tree) Workqueue: events_unbound flip_worker Backtrace: [] (dump_backtrace) from [] (show_stack+0x18/0x1c) r7:c0b1b13c r6:600b0013 r5: r4:c0b1b13c [] (show_stack) from [] (dump_stack+0x78/0x94) [] (dump_stack) from [] (__warn+0xe4/0x104) r7:0009 r6:c03cf26c r5: r4: [] (__warn) from [] (warn_slowpath_null+0x28/0x30) r9:eeb443a0 r8:eeb443c8 r7:ee8a5ec0 r6:ee8a5ec0 r5:edb47f00 r4:ee096200 [] (warn_slowpath_null) from [] (drm_vblank_put+0x40/0xcc) [] (drm_vblank_put) from [] (drm_crtc_vblank_put+0x18/0x1c) r5:edb47f00 r4:ee3c8a80 [] (drm_crtc_vblank_put) from [] (vop_fb_unref_worker+0x18/0x24) [] (vop_fb_unref_worker) from [] (flip_worker+0x98/0xb4) r5:edb47f00 r4:eeb443a8 [] (flip_worker) from [] (process_one_work+0x1a8/0x2fc) r9: r8:ee807d00 r7: r6:ee809c00 r5:eeb443a8 r4:edfe5f80 [] (process_one_work) from [] (worker_thread+0x2ac/0x458) r10:0088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 r5:ee809c00 r4:edfe5f80 [] (worker_thread) from [] (kthread+0xfc/0x10c) r10: r9: r8:c0135640 r7:edfe5f80 r6: r5:edf0e240 r4:ee8a4000 r3:ed194e00 [] (kthread) from [] (ret_from_fork+0x14/0x3c) r8: r7: r6: r5:c0139fc0 r4:edf0e240 ---[ end trace 0002 ]--- It seems that this is caused by unfortunate timing between vop_crtc_atomic_flush() and vop_handle_vblank() given the following ordering: atomic_flushhandle_vblank - drm_flip_work_queue set_bit if (test_and_clear_bit(...)) drm_flip_work_commit drm_vblank_get This results in vop_fb_unref_worker (called as flip work) decrementing the vblank refcount before it has been incremented. Signed-off-by: John Keeping--- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 6755a9eea4b2..d4e1400aedf3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1017,9 +1017,9 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, continue; drm_framebuffer_get(old_plane_state->fb); + WARN_ON(drm_crtc_vblank_get(crtc) != 0); drm_flip_work_queue(>fb_unref_work, old_plane_state->fb); set_bit(VOP_PENDING_FB_UNREF, >pending); - WARN_ON(drm_crtc_vblank_get(crtc) != 0); } } -- 2.16.3 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel