From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Keeping Subject: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed Date: Wed, 13 Jan 2016 12:53:34 +0000 Message-ID: <1452689614-6570-1-git-send-email-john@metanate.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao 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 QXMgY29tbWVudGVkIGluIGRybV9hdG9taWNfaGVscGVyX3dhaXRfZm9yX3ZibGFua3MoKSwgdXNl cnNwYWNlIHJlbGllcwpvbiBjdXJzb3IgaW9jdGxzIGJlaW5nIHVuc3luY2VkLiAgQ29udmVydGlu ZyB0aGUgcm9ja2NoaXAgZHJpdmVyIHRvCmF0b21pYyBoYXMgc2lnbmlmaWNhbnRseSBpbXBhY3Rl ZCBjdXJzb3IgcGVyZm9ybWFuY2UgYnkgbWFraW5nIGV2ZXJ5CmN1cnNvciB1cGRhdGUgd2FpdCBm b3IgdmJsYW5rLgoKQnkgc2tpcHBpbmcgdGhlIHZibGFuayBzeW5jIHdoZW4gdGhlIGZyYW1lYnVm ZmVyIGhhcyBub3QgY2hhbmdlZCAoYXMgaXMKZG9uZSBpbiBkcm1fYXRvbWljX2hlbHBlcl93YWl0 X2Zvcl92YmxhbmtzKCkpIHdlIGNhbiBhdm9pZCB0aGlzIGZvciB0aGUKY29tbW9uIGNhc2Ugb2Yg bW92aW5nIHRoZSBjdXJzb3IgYW5kIG9ubHkgbmVlZCB0byBkZWxheSB0aGUgY3Vyc29yIGlvY3Rs CndoZW4gdGhlIGN1cnNvciBpY29uIGNoYW5nZXMuCgpJIG9yaWdpbmFsbHkgaW5zZXJ0ZWQgYSBj aGVjayBvbiBsZWdhY3lfY3Vyc29yX3VwZGF0ZSBhcyB3ZWxsLCBidXQgdGhhdApjYXVzZWQgYSBz dG9ybSBvZiBpb21tdSBwYWdlIGZhdWx0cy4gIEkgZGlkbid0IGludmVzdGlnYXRlIHRoZSBjYXVz ZSBvZgp0aG9zZSBzaW5jZSB0aGlzIGNoYW5nZSBnaXZlcyBlbm91Z2ggb2YgYSBwZXJmb3JtYW5j ZSBpbXByb3ZlbWVudCBmb3IgbXkKdXNlIGNhc2UuCgpUaGlzIGlzIFJGQyBiZWNhdXNlIG9mIHRo YXQgYW5kIGJlY2F1c2UgdGhlIGZyYW1lYnVmZmVyX2NoYW5nZWQoKQpmdW5jdGlvbiBpcyBjb3Bp ZWQgZnJvbSBkcm1fYXRvbWljX2hlbHBlci5jIGFzIGEgcXVpY2sgd2F5IHRvIHRlc3QgdGhlCnJl c3VsdC4KClNpZ25lZC1vZmYtYnk6IEpvaG4gS2VlcGluZyA8am9obkBtZXRhbmF0ZS5jb20+Ci0t LQogZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jIHwgMjcgKysrKysr KysrKysrKysrKysrKysrKysrKy0tCiAxIGZpbGUgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwg MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9j a2NoaXBfZHJtX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Zi LmMKaW5kZXggZjc4NDQ4OC4uOGZkOTgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9y b2NrY2hpcF9kcm1fZmIuYwpAQCAtMTc3LDggKzE3NywyOCBAQCBzdGF0aWMgdm9pZCByb2NrY2hp cF9jcnRjX3dhaXRfZm9yX3VwZGF0ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiAJCWNydGNfZnVu Y3MtPndhaXRfZm9yX3VwZGF0ZShjcnRjKTsKIH0KIAorc3RhdGljIGJvb2wgZnJhbWVidWZmZXJf Y2hhbmdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0 YXRlICpvbGRfc3RhdGUsCisJCQkJc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBk cm1fcGxhbmUgKnBsYW5lOworCXN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm9sZF9wbGFuZV9zdGF0 ZTsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3BsYW5lX2luX3N0YXRlKG9sZF9zdGF0ZSwgcGxhbmUs IG9sZF9wbGFuZV9zdGF0ZSwgaSkgeworCQlpZiAocGxhbmUtPnN0YXRlLT5jcnRjICE9IGNydGMg JiYKKwkJICAgIG9sZF9wbGFuZV9zdGF0ZS0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisK KwkJaWYgKHBsYW5lLT5zdGF0ZS0+ZmIgIT0gb2xkX3BsYW5lX3N0YXRlLT5mYikKKwkJCXJldHVy biB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQKLXJvY2tjaGlw X2F0b21pY193YWl0X2Zvcl9jb21wbGV0ZShzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0 YXRlKQorcm9ja2NoaXBfYXRvbWljX3dhaXRfZm9yX2NvbXBsZXRlKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpvbGRfc3RhdGUpCiB7CiAJc3RydWN0IGRy bV9jcnRjX3N0YXRlICpvbGRfY3J0Y19zdGF0ZTsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CkBA IC0xOTQsNiArMjE0LDkgQEAgcm9ja2NoaXBfYXRvbWljX3dhaXRfZm9yX2NvbXBsZXRlKHN0cnVj dCBkcm1fYXRvbWljX3N0YXRlICpvbGRfc3RhdGUpCiAJCWlmICghY3J0Yy0+c3RhdGUtPmFjdGl2 ZSkKIAkJCWNvbnRpbnVlOwogCisJCWlmICghZnJhbWVidWZmZXJfY2hhbmdlZChkZXYsIG9sZF9z dGF0ZSwgY3J0YykpCisJCQljb250aW51ZTsKKwogCQlyZXQgPSBkcm1fY3J0Y192YmxhbmtfZ2V0 KGNydGMpOwogCQlpZiAocmV0ICE9IDApCiAJCQljb250aW51ZTsKQEAgLTI0MSw3ICsyNjQsNyBA QCByb2NrY2hpcF9hdG9taWNfY29tbWl0X2NvbXBsZXRlKHN0cnVjdCByb2NrY2hpcF9hdG9taWNf Y29tbWl0ICpjb21taXQpCiAKIAlkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfcGxhbmVzKGRldiwg c3RhdGUsIHRydWUpOwogCi0Jcm9ja2NoaXBfYXRvbWljX3dhaXRfZm9yX2NvbXBsZXRlKHN0YXRl KTsKKwlyb2NrY2hpcF9hdG9taWNfd2FpdF9mb3JfY29tcGxldGUoZGV2LCBzdGF0ZSk7CiAKIAlk cm1fYXRvbWljX2hlbHBlcl9jbGVhbnVwX3BsYW5lcyhkZXYsIHN0YXRlKTsKIAotLSAKMi43LjAu cmMzLjE0MC5nNTIwYTA5MwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmkt ZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: john@metanate.com (John Keeping) Date: Wed, 13 Jan 2016 12:53:34 +0000 Subject: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed Message-ID: <1452689614-6570-1-git-send-email-john@metanate.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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; +} + static void -rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state) +rockchip_atomic_wait_for_complete(struct drm_device *dev, struct drm_atomic_state *old_state) { struct drm_crtc_state *old_crtc_state; struct drm_crtc *crtc; @@ -194,6 +214,9 @@ rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state) if (!crtc->state->active) continue; + if (!framebuffer_changed(dev, old_state, crtc)) + continue; + ret = drm_crtc_vblank_get(crtc); if (ret != 0) continue; @@ -241,7 +264,7 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit) drm_atomic_helper_commit_planes(dev, state, true); - rockchip_atomic_wait_for_complete(state); + rockchip_atomic_wait_for_complete(dev, state); drm_atomic_helper_cleanup_planes(dev, state); -- 2.7.0.rc3.140.g520a093 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755289AbcAMMxz (ORCPT ); Wed, 13 Jan 2016 07:53:55 -0500 Received: from dougal.metanate.com ([90.155.101.14]:52586 "EHLO metanate.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755089AbcAMMxw (ORCPT ); Wed, 13 Jan 2016 07:53:52 -0500 From: John Keeping To: Mark Yao Cc: Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, John Keeping Subject: [RFC/PATCH] drm/rockchip: don't wait for vblank if fb hasn't changed Date: Wed, 13 Jan 2016 12:53:34 +0000 Message-Id: <1452689614-6570-1-git-send-email-john@metanate.com> X-Mailer: git-send-email 2.7.0.rc3.140.g520a093 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; +} + static void -rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state) +rockchip_atomic_wait_for_complete(struct drm_device *dev, struct drm_atomic_state *old_state) { struct drm_crtc_state *old_crtc_state; struct drm_crtc *crtc; @@ -194,6 +214,9 @@ rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state) if (!crtc->state->active) continue; + if (!framebuffer_changed(dev, old_state, crtc)) + continue; + ret = drm_crtc_vblank_get(crtc); if (ret != 0) continue; @@ -241,7 +264,7 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit) drm_atomic_helper_commit_planes(dev, state, true); - rockchip_atomic_wait_for_complete(state); + rockchip_atomic_wait_for_complete(dev, state); drm_atomic_helper_cleanup_planes(dev, state); -- 2.7.0.rc3.140.g520a093