From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sandy Huang Subject: Re: [PATCH] drm/rockchip: fix VOP vblank race Date: Tue, 10 Apr 2018 20:40:06 +0800 Message-ID: <38a49065-4667-4d91-3191-ec81b03cba44@rock-chips.com> References: <20180328160351.23763-1-john@metanate.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180328160351.23763-1-john@metanate.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: John Keeping Cc: linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org, =?UTF-8?Q?Heiko_St=c3=bcbner?= , linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org UmV2aWV3ZWQtYnk6IFNhbmR5IGh1YW5nIDxoamNAcm9jay1jaGlwcy5jb20+CgrlnKggMjAxOC8z LzI5IDA6MDMsIEpvaG4gS2VlcGluZyDlhpnpgZM6Cj4gV2UgaGF2ZSBzZWVuIGEgY2FzZSBvZiBh IGJhZCByZWZlcmVuY2UgY291bnQgZm9yIHZibGFua3Mgd2l0aCB0aGUKPiBSb2NrY2hpcCBWT1A6 Cj4KPiAJLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tCj4gCVdBUk5JTkc6IENQ VTogMSBQSUQ6IDM4MyBhdCBkcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jOjExOTggZHJtX3ZibGFu a19wdXQrMHg0MC8weGNjCj4gCU1vZHVsZXMgbGlua2VkIGluOiBicmNtZm1hYyBicmNtdXRpbAo+ IAlDUFU6IDEgUElEOiAzODMgQ29tbToga3dvcmtlci91ODoyIE5vdCB0YWludGVkIDQuOS43NS1y dDYwICMxCj4gCUhhcmR3YXJlIG5hbWU6IFJvY2tjaGlwIChEZXZpY2UgVHJlZSkKPiAJV29ya3F1 ZXVlOiBldmVudHNfdW5ib3VuZCBmbGlwX3dvcmtlcgo+IAlCYWNrdHJhY2U6Cj4gCVs8YzAxMGI3 YjA+XSAoZHVtcF9iYWNrdHJhY2UpIGZyb20gWzxjMDEwYmE0Yz5dIChzaG93X3N0YWNrKzB4MTgv MHgxYykKPiAJIHI3OmMwYjFiMTNjIHI2OjYwMGIwMDEzIHI1OjAwMDAwMDAwIHI0OmMwYjFiMTNj Cj4gCVs8YzAxMGJhMzQ+XSAoc2hvd19zdGFjaykgZnJvbSBbPGMwMzJkMjQ4Pl0gKGR1bXBfc3Rh Y2srMHg3OC8weDk0KQo+IAlbPGMwMzJkMWQwPl0gKGR1bXBfc3RhY2spIGZyb20gWzxjMDExZTZl OD5dIChfX3dhcm4rMHhlNC8weDEwNCkKPiAJIHI3OjAwMDAwMDA5IHI2OmMwM2NmMjZjIHI1OjAw MDAwMDAwIHI0OjAwMDAwMDAwCj4gCVs8YzAxMWU2MDQ+XSAoX193YXJuKSBmcm9tIFs8YzAxMWU3 YzA+XSAod2Fybl9zbG93cGF0aF9udWxsKzB4MjgvMHgzMCkKPiAJIHI5OmVlYjQ0M2EwIHI4OmVl YjQ0M2M4IHI3OmVlOGE1ZWMwIHI2OmVlOGE1ZWMwIHI1OmVkYjQ3ZjAwIHI0OmVlMDk2MjAwCj4g CVs8YzAxMWU3OTg+XSAod2Fybl9zbG93cGF0aF9udWxsKSBmcm9tIFs8YzAzY2YyNmM+XSAoZHJt X3ZibGFua19wdXQrMHg0MC8weGNjKQo+IAlbPGMwM2NmMjJjPl0gKGRybV92YmxhbmtfcHV0KSBm cm9tIFs8YzAzY2YzMTA+XSAoZHJtX2NydGNfdmJsYW5rX3B1dCsweDE4LzB4MWMpCj4gCSByNTpl ZGI0N2YwMCByNDplZTNjOGE4MAo+IAlbPGMwM2NmMmY4Pl0gKGRybV9jcnRjX3ZibGFua19wdXQp IGZyb20gWzxjMDNlZjliND5dICh2b3BfZmJfdW5yZWZfd29ya2VyKzB4MTgvMHgyNCkKPiAJWzxj MDNlZjk5Yz5dICh2b3BfZmJfdW5yZWZfd29ya2VyKSBmcm9tIFs8YzAzZGYxOTQ+XSAoZmxpcF93 b3JrZXIrMHg5OC8weGI0KQo+IAkgcjU6ZWRiNDdmMDAgcjQ6ZWViNDQzYTgKPiAJWzxjMDNkZjBm Yz5dIChmbGlwX3dvcmtlcikgZnJvbSBbPGMwMTM0ODA4Pl0gKHByb2Nlc3Nfb25lX3dvcmsrMHgx YTgvMHgyZmMpCj4gCSByOTowMDAwMDAwMCByODplZTgwN2QwMCByNzowMDAwMDAwMCByNjplZTgw OWMwMCByNTplZWI0NDNhOCByNDplZGZlNWY4MAo+IAlbPGMwMTM0NjYwPl0gKHByb2Nlc3Nfb25l X3dvcmspIGZyb20gWzxjMDEzNThlYz5dICh3b3JrZXJfdGhyZWFkKzB4MmFjLzB4NDU4KQo+IAkg cjEwOjAwMDAwMDg4IHI5OmVkZmU1Zjk4IHI4OmVlODA5YzJjIHI3OmMwYjA0MTAwIHI2OmVlODA5 YzAwIHI1OmVlODA5YzAwCj4gCSByNDplZGZlNWY4MAo+IAlbPGMwMTM1NjQwPl0gKHdvcmtlcl90 aHJlYWQpIGZyb20gWzxjMDEzYTBiYz5dIChrdGhyZWFkKzB4ZmMvMHgxMGMpCj4gCSByMTA6MDAw MDAwMDAgcjk6MDAwMDAwMDAgcjg6YzAxMzU2NDAgcjc6ZWRmZTVmODAgcjY6MDAwMDAwMDAgcjU6 ZWRmMGUyNDAKPiAJIHI0OmVlOGE0MDAwIHIzOmVkMTk0ZTAwCj4gCVs8YzAxMzlmYzA+XSAoa3Ro cmVhZCkgZnJvbSBbPGMwMTA3Y2I4Pl0gKHJldF9mcm9tX2ZvcmsrMHgxNC8weDNjKQo+IAkgcjg6 MDAwMDAwMDAgcjc6MDAwMDAwMDAgcjY6MDAwMDAwMDAgcjU6YzAxMzlmYzAgcjQ6ZWRmMGUyNDAK PiAJLS0tWyBlbmQgdHJhY2UgMDAwMDAwMDAwMDAwMDAwMiBdLS0tCj4KPiBJdCBzZWVtcyB0aGF0 IHRoaXMgaXMgY2F1c2VkIGJ5IHVuZm9ydHVuYXRlIHRpbWluZyBiZXR3ZWVuCj4gdm9wX2NydGNf YXRvbWljX2ZsdXNoKCkgYW5kIHZvcF9oYW5kbGVfdmJsYW5rKCkgZ2l2ZW4gdGhlIGZvbGxvd2lu Zwo+IG9yZGVyaW5nOgo+Cj4gCWF0b21pY19mbHVzaAkJaGFuZGxlX3ZibGFuawo+IAktLS0tLS0t LS0tLS0JCS0tLS0tLS0tLS0tLS0KPgo+IAlkcm1fZmxpcF93b3JrX3F1ZXVlCj4gCXNldF9iaXQK PiAJICAgICAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KC4uLikpCj4gCSAgICAgCQkJCWRybV9m bGlwX3dvcmtfY29tbWl0Cj4gCWRybV92YmxhbmtfZ2V0Cj4KPiBUaGlzIHJlc3VsdHMgaW4gdm9w X2ZiX3VucmVmX3dvcmtlciAoY2FsbGVkIGFzIGZsaXAgd29yaykgZGVjcmVtZW50aW5nCj4gdGhl IHZibGFuayByZWZjb3VudCBiZWZvcmUgaXQgaGFzIGJlZW4gaW5jcmVtZW50ZWQuCj4KPiBTaWdu ZWQtb2ZmLWJ5OiBKb2huIEtlZXBpbmcgPGpvaG5AbWV0YW5hdGUuY29tPgo+IC0tLQo+ICAgZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3AuYyB8IDIgKy0KPiAgIDEgZmls ZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQo+Cj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMgYi9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4gaW5kZXggNjc1NWE5ZWVhNGIyLi5k NGUxNDAwYWVkZjMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX2RybV92b3AuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fdm9wLmMKPiBAQCAtMTAxNyw5ICsxMDE3LDkgQEAgc3RhdGljIHZvaWQgdm9wX2NydGNfYXRv bWljX2ZsdXNoKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKPiAgIAkJCWNvbnRpbnVlOwo+ICAgCj4g ICAJCWRybV9mcmFtZWJ1ZmZlcl9nZXQob2xkX3BsYW5lX3N0YXRlLT5mYik7Cj4gKwkJV0FSTl9P Tihkcm1fY3J0Y192YmxhbmtfZ2V0KGNydGMpICE9IDApOwo+ICAgCQlkcm1fZmxpcF93b3JrX3F1 ZXVlKCZ2b3AtPmZiX3VucmVmX3dvcmssIG9sZF9wbGFuZV9zdGF0ZS0+ZmIpOwo+ICAgCQlzZXRf Yml0KFZPUF9QRU5ESU5HX0ZCX1VOUkVGLCAmdm9wLT5wZW5kaW5nKTsKPiAtCQlXQVJOX09OKGRy bV9jcnRjX3ZibGFua19nZXQoY3J0YykgIT0gMCk7Cj4gICAJfQo+ICAgfQo+ICAgCgoKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJu ZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: hjc@rock-chips.com (Sandy Huang) Date: Tue, 10 Apr 2018 20:40:06 +0800 Subject: [PATCH] drm/rockchip: fix VOP vblank race In-Reply-To: <20180328160351.23763-1-john@metanate.com> References: <20180328160351.23763-1-john@metanate.com> Message-ID: <38a49065-4667-4d91-3191-ec81b03cba44@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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:00000000 r4:c0b1b13c > [] (show_stack) from [] (dump_stack+0x78/0x94) > [] (dump_stack) from [] (__warn+0xe4/0x104) > r7:00000009 r6:c03cf26c r5:00000000 r4:00000000 > [] (__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:00000000 r8:ee807d00 r7:00000000 r6:ee809c00 r5:eeb443a8 r4:edfe5f80 > [] (process_one_work) from [] (worker_thread+0x2ac/0x458) > r10:00000088 r9:edfe5f98 r8:ee809c2c r7:c0b04100 r6:ee809c00 r5:ee809c00 > r4:edfe5f80 > [] (worker_thread) from [] (kthread+0xfc/0x10c) > r10:00000000 r9:00000000 r8:c0135640 r7:edfe5f80 r6:00000000 r5:edf0e240 > r4:ee8a4000 r3:ed194e00 > [] (kthread) from [] (ret_from_fork+0x14/0x3c) > r8:00000000 r7:00000000 r6:00000000 r5:c0139fc0 r4:edf0e240 > ---[ end trace 0000000000000002 ]--- > > It seems that this is caused by unfortunate timing between > vop_crtc_atomic_flush() and vop_handle_vblank() given the following > ordering: > > atomic_flush handle_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(&vop->fb_unref_work, old_plane_state->fb); > set_bit(VOP_PENDING_FB_UNREF, &vop->pending); > - WARN_ON(drm_crtc_vblank_get(crtc) != 0); > } > } >