From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed Date: Wed, 13 Jan 2016 16:40:05 +0100 Message-ID: <20160113154005.GT19130@phenom.ffwll.local> References: <1452689614-6570-1-git-send-email-john@metanate.com> <20160113142320.GQ19130@phenom.ffwll.local> <20160113143425.363ce07a.john@metanate.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20160113143425.363ce07a.john@metanate.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: John Keeping Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org T24gV2VkLCBKYW4gMTMsIDIwMTYgYXQgMDI6MzQ6MjVQTSArMDAwMCwgSm9obiBLZWVwaW5nIHdy b3RlOgo+IE9uIFdlZCwgMTMgSmFuIDIwMTYgMTU6MjM6MjAgKzAxMDAsIERhbmllbCBWZXR0ZXIg d3JvdGU6Cj4gCj4gPiBPbiBXZWQsIEphbiAxMywgMjAxNiBhdCAxMjo1MzozNFBNICswMDAwLCBK b2huIEtlZXBpbmcgd3JvdGU6Cj4gPiA+IEFzIGNvbW1lbnRlZCBpbiBkcm1fYXRvbWljX2hlbHBl cl93YWl0X2Zvcl92YmxhbmtzKCksIHVzZXJzcGFjZQo+ID4gPiByZWxpZXMgb24gY3Vyc29yIGlv Y3RscyBiZWluZyB1bnN5bmNlZC4gIENvbnZlcnRpbmcgdGhlIHJvY2tjaGlwCj4gPiA+IGRyaXZl ciB0byBhdG9taWMgaGFzIHNpZ25pZmljYW50bHkgaW1wYWN0ZWQgY3Vyc29yIHBlcmZvcm1hbmNl IGJ5Cj4gPiA+IG1ha2luZyBldmVyeSBjdXJzb3IgdXBkYXRlIHdhaXQgZm9yIHZibGFuay4KPiA+ ID4gCj4gPiA+IEJ5IHNraXBwaW5nIHRoZSB2Ymxhbmsgc3luYyB3aGVuIHRoZSBmcmFtZWJ1ZmZl ciBoYXMgbm90IGNoYW5nZWQKPiA+ID4gKGFzIGlzIGRvbmUgaW4gZHJtX2F0b21pY19oZWxwZXJf d2FpdF9mb3JfdmJsYW5rcygpKSB3ZSBjYW4gYXZvaWQKPiA+ID4gdGhpcyBmb3IgdGhlIGNvbW1v biBjYXNlIG9mIG1vdmluZyB0aGUgY3Vyc29yIGFuZCBvbmx5IG5lZWQgdG8KPiA+ID4gZGVsYXkg dGhlIGN1cnNvciBpb2N0bCB3aGVuIHRoZSBjdXJzb3IgaWNvbiBjaGFuZ2VzLgo+ID4gPiAKPiA+ ID4gSSBvcmlnaW5hbGx5IGluc2VydGVkIGEgY2hlY2sgb24gbGVnYWN5X2N1cnNvcl91cGRhdGUg YXMgd2VsbCwgYnV0Cj4gPiA+IHRoYXQgY2F1c2VkIGEgc3Rvcm0gb2YgaW9tbXUgcGFnZSBmYXVs dHMuICBJIGRpZG4ndCBpbnZlc3RpZ2F0ZSB0aGUKPiA+ID4gY2F1c2Ugb2YgdGhvc2Ugc2luY2Ug dGhpcyBjaGFuZ2UgZ2l2ZXMgZW5vdWdoIG9mIGEgcGVyZm9ybWFuY2UKPiA+ID4gaW1wcm92ZW1l bnQgZm9yIG15IHVzZSBjYXNlLgo+ID4gPiAKPiA+ID4gVGhpcyBpcyBSRkMgYmVjYXVzZSBvZiB0 aGF0IGFuZCBiZWNhdXNlIHRoZSBmcmFtZWJ1ZmZlcl9jaGFuZ2VkKCkKPiA+ID4gZnVuY3Rpb24g aXMgY29waWVkIGZyb20gZHJtX2F0b21pY19oZWxwZXIuYyBhcyBhIHF1aWNrIHdheSB0byB0ZXN0 Cj4gPiA+IHRoZSByZXN1bHQuCj4gPiA+IAo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBKb2huIEtlZXBp bmcgPGpvaG5AbWV0YW5hdGUuY29tPgo+ID4gPiAtLS0KPiA+ID4gIGRyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9yb2NrY2hpcF9kcm1fZmIuYyB8IDI3Cj4gPiA+ICsrKysrKysrKysrKysrKysrKysr KysrKystLSAxIGZpbGUgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMgo+ID4gPiBkZWxldGlv bnMoLSkKPiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAv cm9ja2NoaXBfZHJtX2ZiLmMKPiA+ID4gYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2No aXBfZHJtX2ZiLmMgaW5kZXggZjc4NDQ4OC4uOGZkOTgyMQo+ID4gPiAxMDA2NDQgLS0tIGEvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jCj4gPiA+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmIuYwo+ID4gPiBAQCAtMTc3LDggKzE3 NywyOCBAQCBzdGF0aWMgdm9pZAo+ID4gPiByb2NrY2hpcF9jcnRjX3dhaXRfZm9yX3VwZGF0ZShz dHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gPiA+IGNydGNfZnVuY3MtPndhaXRfZm9yX3VwZGF0ZShj cnRjKTsgfQo+ID4gPiAgCj4gPiA+ICtzdGF0aWMgYm9vbCBmcmFtZWJ1ZmZlcl9jaGFuZ2VkKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPiA+ICsJCQkJc3RydWN0IGRybV9hdG9taWNfc3RhdGUg Km9sZF9zdGF0ZSwKPiA+ID4gKwkJCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gPiA+ICt7Cj4g PiA+ICsJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7Cj4gPiA+ICsJc3RydWN0IGRybV9wbGFuZV9z dGF0ZSAqb2xkX3BsYW5lX3N0YXRlOwo+ID4gPiArCWludCBpOwo+ID4gPiArCj4gPiA+ICsJZm9y X2VhY2hfcGxhbmVfaW5fc3RhdGUob2xkX3N0YXRlLCBwbGFuZSwgb2xkX3BsYW5lX3N0YXRlLAo+ ID4gPiBpKSB7Cj4gPiA+ICsJCWlmIChwbGFuZS0+c3RhdGUtPmNydGMgIT0gY3J0YyAmJgo+ID4g PiArCQkgICAgb2xkX3BsYW5lX3N0YXRlLT5jcnRjICE9IGNydGMpCj4gPiA+ICsJCQljb250aW51 ZTsKPiA+ID4gKwo+ID4gPiArCQlpZiAocGxhbmUtPnN0YXRlLT5mYiAhPSBvbGRfcGxhbmVfc3Rh dGUtPmZiKQo+ID4gPiArCQkJcmV0dXJuIHRydWU7Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJ cmV0dXJuIGZhbHNlOwo+ID4gPiArfSAgCj4gPiAKPiA+IFBsZWFzZSBkb24ndCBoYW5kLXJvbGwg bG9naWMgdGhhdCBhZmZlY3RzIHNlbWFudGljcyBsaWtlIHRoaXMuIEluc3RlYWQKPiA+IHBsZWFz ZSB1c2UgZHJtX2F0b21pY19oZWxwZXJfd2FpdF9mb3JfdmJsYW5rcygpLCB3aGljaCBzaG91bGQg ZG8gdGhpcwo+ID4gY29ycmVjdGx5IGZvciB5b3UuCj4gPiAKPiA+IElmIHRoYXQncyBub3QgdGhl IGNhc2UgdGhlbiB3ZSBuZWVkIHRvIGltcHJvdmUgdGhlIGdlbmVyaWMgaGVscGVyLCBvcgo+ID4g ZmlndXJlIG91dCB3aGF0J3MgZGlmZmVyZW50IHdpdGggcm9ja2hpcC4KPiAKPiBBY2NvcmRpbmcg dG8gY29tbWl0IDYzZWJiOWYgKGRybS9yb2NrY2hpcDogQ29udmVydCB0byBzdXBwb3J0IGF0b21p Ywo+IEFQSSkgaXQncyBiZWNhdXNlIHJvY2tjaGlwIGRvZXNuJ3QgaGF2ZSBhIGhhcmR3YXJlIHZi bGFuayBjb3VudGVyLgo+IAo+IEknbSBub3QgZW50aXJlbHkgY2xlYXIgb24gd2h5IHRoaXMgcHJl dmVudHMgdGhlIHVzZSBvZgo+IGRybV9hdG9taWNfaGVscGVyX3dhaXRfZm9yX3ZibGFua3MoKS4K CkhtLCB0aGF0IGNvbW1pdCBpc24ndCB0ZXJyaWJseSBoZWxwZnVsLiBJZiB0aGF0J3MgcmVhbGx5 IG5lZWRlZCB0aGVuIGltbyBJCnRoaW5rIHdlIHNob3VsZCBleHRyYWN0IGEgImRybV9hdG9taWNf aGVscGVyX3BsYW5lX25lZWRzX3ZibGFua193YWl0KCkiCmhlbHBlciB0aGF0J3MgdXNlZCBieSBi b3RoLiBCdXQgc2luY2Ugcm9ja2NoaXAgZG9lcyB2YmxhbmtfZ2V0L3B1dCBjYWxscwpJJ2QgaG9w ZSB2YmxhbmtzIGFjdHVhbGx5IHdvcmsgY29ycmVjdGx5LiBBbmQgdGhlbiB0aGUgaGVscGVyIHNo b3VsZCB3b3JrCnRvby4KLURhbmllbAotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVl ciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Wed, 13 Jan 2016 16:40:05 +0100 Subject: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed In-Reply-To: <20160113143425.363ce07a.john@metanate.com> References: <1452689614-6570-1-git-send-email-john@metanate.com> <20160113142320.GQ19130@phenom.ffwll.local> <20160113143425.363ce07a.john@metanate.com> Message-ID: <20160113154005.GT19130@phenom.ffwll.local> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Jan 13, 2016 at 02:34:25PM +0000, John Keeping wrote: > On Wed, 13 Jan 2016 15:23:20 +0100, Daniel Vetter wrote: > > > On Wed, Jan 13, 2016 at 12:53:34PM +0000, John Keeping wrote: > > > As commented in drm_atomic_helper_wait_for_vblanks(), userspace > > > relies on cursor ioctls being unsynced. Converting the rockchip > > > driver to atomic has significantly impacted cursor performance by > > > making every cursor update wait for vblank. > > > > > > By skipping the vblank sync when the framebuffer has not changed > > > (as is done in drm_atomic_helper_wait_for_vblanks()) we can avoid > > > this for the common case of moving the cursor and only need to > > > delay the cursor ioctl when the cursor icon changes. > > > > > > I originally inserted a check on legacy_cursor_update as well, but > > > that caused a storm of iommu page faults. I didn't investigate the > > > cause of those since this change gives enough of a performance > > > improvement for my use case. > > > > > > This is RFC because of that and because the framebuffer_changed() > > > function is copied from drm_atomic_helper.c as a quick way to test > > > the result. > > > > > > Signed-off-by: John Keeping > > > --- > > > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 27 > > > +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 > > > deletions(-) > > > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index f784488..8fd9821 > > > 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > @@ -177,8 +177,28 @@ static void > > > rockchip_crtc_wait_for_update(struct drm_crtc *crtc) > > > crtc_funcs->wait_for_update(crtc); } > > > > > > +static bool framebuffer_changed(struct drm_device *dev, > > > + struct drm_atomic_state *old_state, > > > + struct drm_crtc *crtc) > > > +{ > > > + struct drm_plane *plane; > > > + struct drm_plane_state *old_plane_state; > > > + int i; > > > + > > > + for_each_plane_in_state(old_state, plane, old_plane_state, > > > i) { > > > + if (plane->state->crtc != crtc && > > > + old_plane_state->crtc != crtc) > > > + continue; > > > + > > > + if (plane->state->fb != old_plane_state->fb) > > > + return true; > > > + } > > > + > > > + return false; > > > +} > > > > Please don't hand-roll logic that affects semantics like this. Instead > > please use drm_atomic_helper_wait_for_vblanks(), which should do this > > correctly for you. > > > > If that's not the case then we need to improve the generic helper, or > > figure out what's different with rockhip. > > According to commit 63ebb9f (drm/rockchip: Convert to support atomic > API) it's because rockchip doesn't have a hardware vblank counter. > > I'm not entirely clear on why this prevents the use of > drm_atomic_helper_wait_for_vblanks(). Hm, that commit isn't terribly helpful. If that's really needed then imo I think we should extract a "drm_atomic_helper_plane_needs_vblank_wait()" helper that's used by both. But since rockchip does vblank_get/put calls I'd hope vblanks actually work correctly. And then the helper should work too. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752077AbcAMPkH (ORCPT ); Wed, 13 Jan 2016 10:40:07 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:35657 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750712AbcAMPkF (ORCPT ); Wed, 13 Jan 2016 10:40:05 -0500 Date: Wed, 13 Jan 2016 16:40:05 +0100 From: Daniel Vetter To: John Keeping Cc: Daniel Vetter , Mark Yao , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed Message-ID: <20160113154005.GT19130@phenom.ffwll.local> Mail-Followup-To: John Keeping , Mark Yao , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org References: <1452689614-6570-1-git-send-email-john@metanate.com> <20160113142320.GQ19130@phenom.ffwll.local> <20160113143425.363ce07a.john@metanate.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160113143425.363ce07a.john@metanate.com> X-Operating-System: Linux phenom 4.3.0-1-amd64 User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 13, 2016 at 02:34:25PM +0000, John Keeping wrote: > On Wed, 13 Jan 2016 15:23:20 +0100, Daniel Vetter wrote: > > > On Wed, Jan 13, 2016 at 12:53:34PM +0000, John Keeping wrote: > > > As commented in drm_atomic_helper_wait_for_vblanks(), userspace > > > relies on cursor ioctls being unsynced. Converting the rockchip > > > driver to atomic has significantly impacted cursor performance by > > > making every cursor update wait for vblank. > > > > > > By skipping the vblank sync when the framebuffer has not changed > > > (as is done in drm_atomic_helper_wait_for_vblanks()) we can avoid > > > this for the common case of moving the cursor and only need to > > > delay the cursor ioctl when the cursor icon changes. > > > > > > I originally inserted a check on legacy_cursor_update as well, but > > > that caused a storm of iommu page faults. I didn't investigate the > > > cause of those since this change gives enough of a performance > > > improvement for my use case. > > > > > > This is RFC because of that and because the framebuffer_changed() > > > function is copied from drm_atomic_helper.c as a quick way to test > > > the result. > > > > > > Signed-off-by: John Keeping > > > --- > > > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 27 > > > +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 > > > deletions(-) > > > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index f784488..8fd9821 > > > 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > > @@ -177,8 +177,28 @@ static void > > > rockchip_crtc_wait_for_update(struct drm_crtc *crtc) > > > crtc_funcs->wait_for_update(crtc); } > > > > > > +static bool framebuffer_changed(struct drm_device *dev, > > > + struct drm_atomic_state *old_state, > > > + struct drm_crtc *crtc) > > > +{ > > > + struct drm_plane *plane; > > > + struct drm_plane_state *old_plane_state; > > > + int i; > > > + > > > + for_each_plane_in_state(old_state, plane, old_plane_state, > > > i) { > > > + if (plane->state->crtc != crtc && > > > + old_plane_state->crtc != crtc) > > > + continue; > > > + > > > + if (plane->state->fb != old_plane_state->fb) > > > + return true; > > > + } > > > + > > > + return false; > > > +} > > > > Please don't hand-roll logic that affects semantics like this. Instead > > please use drm_atomic_helper_wait_for_vblanks(), which should do this > > correctly for you. > > > > If that's not the case then we need to improve the generic helper, or > > figure out what's different with rockhip. > > According to commit 63ebb9f (drm/rockchip: Convert to support atomic > API) it's because rockchip doesn't have a hardware vblank counter. > > I'm not entirely clear on why this prevents the use of > drm_atomic_helper_wait_for_vblanks(). Hm, that commit isn't terribly helpful. If that's really needed then imo I think we should extract a "drm_atomic_helper_plane_needs_vblank_wait()" helper that's used by both. But since rockchip does vblank_get/put calls I'd hope vblanks actually work correctly. And then the helper should work too. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch