From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sasha Levin Subject: [PATCH AUTOSEL 5.2 043/171] drm/vkms: Forward timer right after drm_crtc_handle_vblank Date: Thu, 18 Jul 2019 23:54:34 -0400 Message-ID: <20190719035643.14300-43-sashal@kernel.org> References: <20190719035643.14300-1-sashal@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by gabe.freedesktop.org (Postfix) with ESMTPS id 42E106E4C5 for ; Fri, 19 Jul 2019 03:58:25 +0000 (UTC) In-Reply-To: <20190719035643.14300-1-sashal@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Sasha Levin , Rodrigo Siqueira , Daniel Vetter , dri-devel@lists.freedesktop.org, Shayenne Moura , Daniel Vetter List-Id: dri-devel@lists.freedesktop.org RnJvbTogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KClsgVXBzdHJlYW0g Y29tbWl0IDczNTU5NjVkYTIyYjhkOWViYWM4YmNlNGI3NzYzOTlmYjBiYjlkMzIgXQoKSW4KCmNv bW1pdCBkZWYzNWU3YzU5MjYxNmJjMDliZTMyOGRlODc5NWU1ZTYyNGEzY2Y4CkF1dGhvcjogU2hh eWVubmUgTW91cmEgPHNoYXllbm5lbHV6bW91cmFAZ21haWwuY29tPgpEYXRlOiAgIFdlZCBKYW4g MzAgMTQ6MDY6MzYgMjAxOSAtMDIwMAoKICAgIGRybS92a21zOiBCdWdmaXggZXh0cmEgdmJsYW5r IGZyYW1lCgp3ZSBmaXhlZCB0aGUgdmJsYW5rIGNvdW50ZXIgdG8gZ2l2ZSBhY2N1cmF0ZSByZXN1 bHRzIG91dHNpZGUgb2YKZHJtX2NydGNfaGFuZGxlX3ZibGFuaywgd2hpY2ggZml4ZWQgYnVncyBh cm91bmQgdmJsYW5rIHRpbWVzdGFtcHMKYmVpbmcgb2ZmLWJ5LW9uZSBhbmQgY2F1c2luZyB0aGUg dmJsYW5rIGNvdW50ZXIgdG8ganVtcCB3aGVuIGl0CnNob3VsZG4ndC4KClRoZSB0cm91YmxlIGlz IHRoYXQgdGhpcyBjb21wbGV0ZWx5IGJyb2tlIGNyYyBnZW5lcmF0aW9uLiBTaGF5ZW5uZSBhbmQK Um9kcmlnbyB0cmFja2VkIHRoaXMgZG93biB0byB0aGUgdmJsYW5rIHRpbWVzdGFtcCBnb2luZyBi YWNrd2FyZHMgaW4KdGltZSBzb21laG93LiBXaGljaCB0aGVuIHJlc3VsdGVkIGluIGFuIHVuZGVy ZmxvdyBpbiBkcm1fdmJsYW5rLmMKY29kZSwgd2hpY2ggcmVzdWx0ZWQgaW4gYWxsIGtpbmRzIG9m IHRoaW5ncyBicmVha2luZyByZWFsbHkgYmFkbHkuCgpUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRo YXQgb25jZSB3ZSd2ZSBjYWxsZWQgZHJtX2NydGNfaGFuZGxlX3ZibGFuawphbmQgdGhlIGhydGlt ZXIgaXNuJ3QgZm9yd2FyZGVkIHlldCwgd2UncmUgcmV0dXJuaW5nIGEgdmJsYW5rCnRpbWVzdGFt cCBpbiB0aGUgcGFzdC4gVGhpcyByYWNlIGlzIHJlYWxseSBoYXJkIHRvIGhpdCBzaW5jZSBpdCdz CnNtYWxsLCBleGNlcHQgd2hlbiB5b3UgZW5hYmxlIGNyYyBnZW5lcmF0aW9uOiBJbiB0aGF0IGNh c2UgdGhlcmUncyBhCmNhbGwgdG8gZHJtX2NydGNfYWNjdXJhdGVfdmJsYW5rIHJpZ2h0IGluLWJl dHdlbiwgc28gd2UncmUgZ3VhcmFudGVlZAp0byBoaXQgdGhlIGJ1Zy4KClRoZSBmaXggaXMgdG8g cm9sbCB0aGUgaHJ0aW1lciBmb3J3YXJkIF9iZWZvcmVfIHdlIGRvIHRoZSB2YmxhbmsKcHJvY2Vz c2luZyAod2hpY2ggaGFzIGEgc2lkZS1lZmZlY3Qgb2YgaW5jcmVtZW50aW5nIHRoZSB2YmxhbmsK Y291bnRlciksIGFuZCB3ZSBhbHdheXMgc3VidHJhY3Qgb25lIGZyYW1lIGZyb20gdGhlIGhydGlt ZXIgLSBzaW5jZQpub3cgaXQncyBhbHdheXMgb25lIGZyYW1lIGluIHRoZSBmdXR1cmUuCgpUbyBt YWtlIHN1cmUgd2UgZG9uJ3QgaGl0IHRoaXMgYWdhaW4gYWxzbyBhZGQgYSBXQVJOX09OIGNoZWNr aW5nIGZvcgp3aGV0aGVyIG91ciB0aW1lc3RhbXAgaXMgc29tZWhvdyBtb3ZpbmcgaW50byB0aGUg cGFzdCwgd2hpY2ggaXMgbmV2ZXIKc2hvdWxkLgoKVGhpcyBhbHNvIGFsaWducyBtb3JlIHdpdGgg aG93IHJlYWwgaHcgd29ya3M6CjEuIGZpcnN0IGFsbCByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgd2l0 aCB0aGUgbmV3IHRpbWVzdGFtcC92YmxhbmsKY291bnRlciB2YWx1ZXMuCjIuIHRoZW4gYW4gaW50 ZXJydXB0IGlzIGdlbmVyYXRlZAozLiBrZXJuZWwgaW50ZXJydXB0IGhhbmRsZXIgZXZlbnR1YWxs eSBmaXJlcy4KClNvIGRvaW5nIHRoaXMgYWxpZ25zIHZrbXMgY2xvc2VyIHdpdGggd2hhdCBkcm1f dmJsYW5rLmMgZXhwZWN0cy4KRG9jdW1lbnQgdGhpcyBhbHNvIGluIGEgY29tbWVudC4KCkNjOiBT aGF5ZW5uZSBNb3VyYSA8c2hheWVubmVsdXptb3VyYUBnbWFpbC5jb20+CkNjOiBSb2RyaWdvIFNp cXVlaXJhIDxyb2RyaWdvc2lxdWVpcmFtZWxvQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogRGFu aWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBpbnRlbC5jb20+ClRlc3RlZC1ieTogUm9kcmlnbyBT aXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVsb0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBSb2Ry aWdvIFNpcXVlaXJhIDxyb2RyaWdvc2lxdWVpcmFtZWxvQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1i eTogUm9kcmlnbyBTaXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVsb0BnbWFpbC5jb20+Ckxpbms6 IGh0dHBzOi8vcGF0Y2h3b3JrLmZyZWVkZXNrdG9wLm9yZy9wYXRjaC9tc2dpZC8yMDE5MDYwNjA4 NDQwNC4xMjAxNC0xLWRhbmllbC52ZXR0ZXJAZmZ3bGwuY2gKU2lnbmVkLW9mZi1ieTogU2FzaGEg TGV2aW4gPHNhc2hhbEBrZXJuZWwub3JnPgotLS0KIGRyaXZlcnMvZ3B1L2RybS92a21zL3ZrbXNf Y3J0Yy5jIHwgMjIgKysrKysrKysrKysrKysrKy0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE2IGlu c2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L3ZrbXMvdmttc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmttcy92a21zX2NydGMuYwppbmRl eCBiYjY2ZGJjZDVlM2YuLmU0NDdiNzU4OGQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L3ZrbXMvdmttc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZrbXMvdmttc19jcnRjLmMK QEAgLTE1LDYgKzE1LDEwIEBAIHN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB2a21zX3ZibGFu a19zaW11bGF0ZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiAKIAlzcGluX2xvY2soJm91dHB1dC0+ bG9jayk7CiAKKwlyZXRfb3ZlcnJ1biA9IGhydGltZXJfZm9yd2FyZF9ub3coJm91dHB1dC0+dmJs YW5rX2hydGltZXIsCisJCQkJCSAgb3V0cHV0LT5wZXJpb2RfbnMpOworCVdBUk5fT04ocmV0X292 ZXJydW4gIT0gMSk7CisKIAlyZXQgPSBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rKGNydGMpOwogCWlm ICghcmV0KQogCQlEUk1fRVJST1IoInZrbXMgZmFpbHVyZSBvbiBoYW5kbGluZyB2YmxhbmsiKTsK QEAgLTM1LDEwICszOSw2IEBAIHN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB2a21zX3ZibGFu a19zaW11bGF0ZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiAJCQlEUk1fV0FSTigiZmFpbGVkIHRv IHF1ZXVlIHZrbXNfY3JjX3dvcmtfaGFuZGxlIik7CiAJfQogCi0JcmV0X292ZXJydW4gPSBocnRp bWVyX2ZvcndhcmRfbm93KCZvdXRwdXQtPnZibGFua19ocnRpbWVyLAotCQkJCQkgIG91dHB1dC0+ cGVyaW9kX25zKTsKLQlXQVJOX09OKHJldF9vdmVycnVuICE9IDEpOwotCiAJc3Bpbl91bmxvY2so Jm91dHB1dC0+bG9jayk7CiAKIAlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOwpAQCAtNzQsMTEgKzc0 LDIxIEBAIGJvb2wgdmttc19nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSwKIHsKIAlzdHJ1Y3Qgdmttc19kZXZpY2UgKnZrbXNkZXYg PSBkcm1fZGV2aWNlX3RvX3ZrbXNfZGV2aWNlKGRldik7CiAJc3RydWN0IHZrbXNfb3V0cHV0ICpv dXRwdXQgPSAmdmttc2Rldi0+b3V0cHV0OworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFu ayA9ICZkZXYtPnZibGFua1twaXBlXTsKIAogCSp2YmxhbmtfdGltZSA9IG91dHB1dC0+dmJsYW5r X2hydGltZXIubm9kZS5leHBpcmVzOwogCi0JaWYgKCFpbl92YmxhbmtfaXJxKQotCQkqdmJsYW5r X3RpbWUgLT0gb3V0cHV0LT5wZXJpb2RfbnM7CisJaWYgKFdBUk5fT04oKnZibGFua190aW1lID09 IHZibGFuay0+dGltZSkpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBUbyBwcmV2ZW50IHJh Y2VzIHdlIHJvbGwgdGhlIGhydGltZXIgZm9yd2FyZCBiZWZvcmUgd2UgZG8gYW55CisJICogaW50 ZXJydXB0IHByb2Nlc3NpbmcgLSB0aGlzIGlzIGhvdyByZWFsIGh3IHdvcmtzICh0aGUgaW50ZXJy dXB0IGlzCisJICogb25seSBnZW5lcmF0ZWQgYWZ0ZXIgYWxsIHRoZSB2YmxhbmsgcmVnaXN0ZXJz IGFyZSB1cGRhdGVkKSBhbmQgd2hhdAorCSAqIHRoZSB2YmxhbmsgY29yZSBleHBlY3RzLiBUaGVy ZWZvcmUgd2UgbmVlZCB0byBhbHdheXMgY29ycmVjdCB0aGUKKwkgKiB0aW1lc3RhbXBlIGJ5IG9u ZSBmcmFtZS4KKwkgKi8KKwkqdmJsYW5rX3RpbWUgLT0gb3V0cHV0LT5wZXJpb2RfbnM7CiAKIAly ZXR1cm4gdHJ1ZTsKIH0KLS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVs From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93D09C76196 for ; Fri, 19 Jul 2019 04:39:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6D8402077C for ; Fri, 19 Jul 2019 04:39:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1563511179; bh=sjTpvekg/2jA/Awx9NsiMfabj+abuEMmkKiAxKHsi9o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=Ye5EJhPb7HZ6FIMdaP3NAqO31KgjPNRNMyejFhALD0qxkzI1jlFuA2me0OmgeAVSn BUejOLoSuTISsWpYk4zMLEysRRiYIiZgHn/jimuD0pal/RlHoJHbfpgbn3SN0F1zni +hB++fveEDBdbWr/93HXMeb0JyblTDFO3rX42ZoE= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728127AbfGSD6b (ORCPT ); Thu, 18 Jul 2019 23:58:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:57768 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728032AbfGSD60 (ORCPT ); Thu, 18 Jul 2019 23:58:26 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 54A1E2189D; Fri, 19 Jul 2019 03:58:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1563508705; bh=sjTpvekg/2jA/Awx9NsiMfabj+abuEMmkKiAxKHsi9o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bwZTS6WDBmSQ7cizhIbPh+6YnFCMMN+wOE6jPo6F0geUjp54XMXIkd4kCMJBUpu87 M3avqzucB+dtzURI0/TAphm9AMOr1X9+ZnYXahjUplMmc2nz238qkLkRZNI0s6Z8lE Ef26n4OpEzU4MqdRgmUEYi9581bN8WUz3nmd7xy8= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Daniel Vetter , Shayenne Moura , Rodrigo Siqueira , Daniel Vetter , Sasha Levin , dri-devel@lists.freedesktop.org Subject: [PATCH AUTOSEL 5.2 043/171] drm/vkms: Forward timer right after drm_crtc_handle_vblank Date: Thu, 18 Jul 2019 23:54:34 -0400 Message-Id: <20190719035643.14300-43-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190719035643.14300-1-sashal@kernel.org> References: <20190719035643.14300-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Vetter [ Upstream commit 7355965da22b8d9ebac8bce4b776399fb0bb9d32 ] In commit def35e7c592616bc09be328de8795e5e624a3cf8 Author: Shayenne Moura Date: Wed Jan 30 14:06:36 2019 -0200 drm/vkms: Bugfix extra vblank frame we fixed the vblank counter to give accurate results outside of drm_crtc_handle_vblank, which fixed bugs around vblank timestamps being off-by-one and causing the vblank counter to jump when it shouldn't. The trouble is that this completely broke crc generation. Shayenne and Rodrigo tracked this down to the vblank timestamp going backwards in time somehow. Which then resulted in an underflow in drm_vblank.c code, which resulted in all kinds of things breaking really badly. The reason for this is that once we've called drm_crtc_handle_vblank and the hrtimer isn't forwarded yet, we're returning a vblank timestamp in the past. This race is really hard to hit since it's small, except when you enable crc generation: In that case there's a call to drm_crtc_accurate_vblank right in-betwen, so we're guaranteed to hit the bug. The fix is to roll the hrtimer forward _before_ we do the vblank processing (which has a side-effect of incrementing the vblank counter), and we always subtract one frame from the hrtimer - since now it's always one frame in the future. To make sure we don't hit this again also add a WARN_ON checking for whether our timestamp is somehow moving into the past, which is never should. This also aligns more with how real hw works: 1. first all registers are updated with the new timestamp/vblank counter values. 2. then an interrupt is generated 3. kernel interrupt handler eventually fires. So doing this aligns vkms closer with what drm_vblank.c expects. Document this also in a comment. Cc: Shayenne Moura Cc: Rodrigo Siqueira Signed-off-by: Daniel Vetter Tested-by: Rodrigo Siqueira Reviewed-by: Rodrigo Siqueira Signed-off-by: Rodrigo Siqueira Link: https://patchwork.freedesktop.org/patch/msgid/20190606084404.12014-1-daniel.vetter@ffwll.ch Signed-off-by: Sasha Levin --- drivers/gpu/drm/vkms/vkms_crtc.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index bb66dbcd5e3f..e447b7588d06 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -15,6 +15,10 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) spin_lock(&output->lock); + ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, + output->period_ns); + WARN_ON(ret_overrun != 1); + ret = drm_crtc_handle_vblank(crtc); if (!ret) DRM_ERROR("vkms failure on handling vblank"); @@ -35,10 +39,6 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) DRM_WARN("failed to queue vkms_crc_work_handle"); } - ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, - output->period_ns); - WARN_ON(ret_overrun != 1); - spin_unlock(&output->lock); return HRTIMER_RESTART; @@ -74,11 +74,21 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, { struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev); struct vkms_output *output = &vkmsdev->output; + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; *vblank_time = output->vblank_hrtimer.node.expires; - if (!in_vblank_irq) - *vblank_time -= output->period_ns; + if (WARN_ON(*vblank_time == vblank->time)) + return true; + + /* + * To prevent races we roll the hrtimer forward before we do any + * interrupt processing - this is how real hw works (the interrupt is + * only generated after all the vblank registers are updated) and what + * the vblank core expects. Therefore we need to always correct the + * timestampe by one frame. + */ + *vblank_time -= output->period_ns; return true; } -- 2.20.1