dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Mikko Perttunen <mperttunen@nvidia.com>
To: thierry.reding@gmail.com, jonathanh@nvidia.com, digetx@gmail.com,
	airlied@linux.ie, daniel@ffwll.ch
Cc: linux-tegra@vger.kernel.org, talho@nvidia.com,
	bhuntsman@nvidia.com, dri-devel@lists.freedesktop.org,
	Mikko Perttunen <mperttunen@nvidia.com>
Subject: [PATCH v4 05/21] gpu: host1x: Use HW-equivalent syncpoint expiration check
Date: Fri, 20 Nov 2020 13:25:44 +0200	[thread overview]
Message-ID: <20201120112600.935082-6-mperttunen@nvidia.com> (raw)
In-Reply-To: <20201120112600.935082-1-mperttunen@nvidia.com>

Make syncpoint expiration checks always use the same logic used by
the hardware. This ensures that there are no race conditions that
could occur because of the hardware triggering a syncpoint interrupt
and then the driver disagreeing.

One situation where this could occur is if a job incremented a
syncpoint too many times -- then the hardware would trigger an
interrupt, but the driver would assume that a syncpoint value
greater than the syncpoint's max value is in the future, and not
clean up the job.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
---
 drivers/gpu/host1x/syncpt.c | 51 ++-----------------------------------
 1 file changed, 2 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/host1x/syncpt.c b/drivers/gpu/host1x/syncpt.c
index 5982fdf64e1c..9ca0d852e32f 100644
--- a/drivers/gpu/host1x/syncpt.c
+++ b/drivers/gpu/host1x/syncpt.c
@@ -306,59 +306,12 @@ EXPORT_SYMBOL(host1x_syncpt_wait);
 bool host1x_syncpt_is_expired(struct host1x_syncpt *sp, u32 thresh)
 {
 	u32 current_val;
-	u32 future_val;
 
 	smp_rmb();
 
 	current_val = (u32)atomic_read(&sp->min_val);
-	future_val = (u32)atomic_read(&sp->max_val);
-
-	/* Note the use of unsigned arithmetic here (mod 1<<32).
-	 *
-	 * c = current_val = min_val	= the current value of the syncpoint.
-	 * t = thresh			= the value we are checking
-	 * f = future_val  = max_val	= the value c will reach when all
-	 *				  outstanding increments have completed.
-	 *
-	 * Note that c always chases f until it reaches f.
-	 *
-	 * Dtf = (f - t)
-	 * Dtc = (c - t)
-	 *
-	 *  Consider all cases:
-	 *
-	 *	A) .....c..t..f.....	Dtf < Dtc	need to wait
-	 *	B) .....c.....f..t..	Dtf > Dtc	expired
-	 *	C) ..t..c.....f.....	Dtf > Dtc	expired	   (Dct very large)
-	 *
-	 *  Any case where f==c: always expired (for any t).	Dtf == Dcf
-	 *  Any case where t==c: always expired (for any f).	Dtf >= Dtc (because Dtc==0)
-	 *  Any case where t==f!=c: always wait.		Dtf <  Dtc (because Dtf==0,
-	 *							Dtc!=0)
-	 *
-	 *  Other cases:
-	 *
-	 *	A) .....t..f..c.....	Dtf < Dtc	need to wait
-	 *	A) .....f..c..t.....	Dtf < Dtc	need to wait
-	 *	A) .....f..t..c.....	Dtf > Dtc	expired
-	 *
-	 *   So:
-	 *	   Dtf >= Dtc implies EXPIRED	(return true)
-	 *	   Dtf <  Dtc implies WAIT	(return false)
-	 *
-	 * Note: If t is expired then we *cannot* wait on it. We would wait
-	 * forever (hang the system).
-	 *
-	 * Note: do NOT get clever and remove the -thresh from both sides. It
-	 * is NOT the same.
-	 *
-	 * If future valueis zero, we have a client managed sync point. In that
-	 * case we do a direct comparison.
-	 */
-	if (!host1x_syncpt_client_managed(sp))
-		return future_val - thresh >= current_val - thresh;
-	else
-		return (s32)(current_val - thresh) >= 0;
+
+	return ((current_val - thresh) & 0x80000000U) == 0U;
 }
 
 int host1x_syncpt_init(struct host1x *host)
-- 
2.29.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2020-11-20 11:27 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-20 11:25 [PATCH v4 00/21] Host1x/TegraDRM UAPI Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 01/21] gpu: host1x: Use different lock classes for each client Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 02/21] gpu: host1x: Allow syncpoints without associated client Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 03/21] gpu: host1x: Show number of pending waiters in debugfs Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 04/21] gpu: host1x: Remove cancelled waiters immediately Mikko Perttunen
2020-11-20 11:25 ` Mikko Perttunen [this message]
2020-11-20 11:25 ` [PATCH v4 06/21] gpu: host1x: Cleanup and refcounting for syncpoints Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 07/21] gpu: host1x: Introduce UAPI header Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 08/21] gpu: host1x: Implement /dev/host1x device node Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 09/21] gpu: host1x: DMA fences and userspace fence creation Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 10/21] gpu: host1x: Add no-recovery mode Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 11/21] gpu: host1x: Add job release callback Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 12/21] gpu: host1x: Add support for syncpoint waits in CDMA pushbuffer Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 13/21] gpu: host1x: Reset max value when freeing a syncpoint Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 14/21] gpu: host1x: Reserve VBLANK syncpoints at initialization Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 15/21] drm/tegra: Add new UAPI to header Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 16/21] drm/tegra: Boot VIC during runtime PM resume Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 17/21] drm/tegra: Set resv fields when importing/exporting GEMs Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 18/21] drm/tegra: Allocate per-engine channel in core code Mikko Perttunen
2020-11-20 11:25 ` [PATCH v4 19/21] drm/tegra: Implement new UAPI Mikko Perttunen
2020-11-20 13:23   ` kernel test robot
2020-11-20 13:23   ` kernel test robot
2020-11-20 11:25 ` [PATCH v4 20/21] drm/tegra: Implement job submission part of " Mikko Perttunen
2020-11-25  0:05   ` kernel test robot
2020-11-20 11:26 ` [PATCH v4 21/21] drm/tegra: Add job firewall Mikko Perttunen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201120112600.935082-6-mperttunen@nvidia.com \
    --to=mperttunen@nvidia.com \
    --cc=airlied@linux.ie \
    --cc=bhuntsman@nvidia.com \
    --cc=daniel@ffwll.ch \
    --cc=digetx@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jonathanh@nvidia.com \
    --cc=linux-tegra@vger.kernel.org \
    --cc=talho@nvidia.com \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).