From: Sharat Masetty <smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
Sharat Masetty <smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: [PATCH 13/13] drm/msm: Implement better timeout detection
Date: Mon, 1 Oct 2018 18:01:45 +0530 [thread overview]
Message-ID: <1538397105-19581-14-git-send-email-smasetty@codeaurora.org> (raw)
In-Reply-To: <1538397105-19581-1-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
The base scheduler patch has barebones timeout implementation, it does
not account for issues like starvation on lower priority rings. This
patch enables more accurate measurement on time spent on each
ringbuffer, thereby helping us with better timeout detection mechanism.
Signed-off-by: Sharat Masetty <smasetty@codeaurora.org>
---
drivers/gpu/drm/msm/adreno/a5xx_preempt.c | 29 +++++++++++++++++++++
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 3 +++
drivers/gpu/drm/msm/msm_ringbuffer.h | 2 ++
drivers/gpu/drm/msm/msm_sched.c | 42 +++++++++++++++++++++++++++++++
4 files changed, 76 insertions(+)
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_preempt.c b/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
index 6a3c560..8bf81c1c 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
@@ -165,6 +165,33 @@ void a5xx_preempt_trigger(struct msm_gpu *gpu)
gpu_write(gpu, REG_A5XX_CP_CONTEXT_SWITCH_CNTL, 1);
}
+static void update_ring_timestamps(struct msm_ringbuffer *prev_ring,
+ struct msm_ringbuffer *cur_ring)
+{
+ unsigned long flags;
+
+ /*
+ * For the outgoing ring(prev_ring), capture the last sample of time
+ * spent on this ring and add it to the ring's total active_time.
+ */
+ spin_lock_irqsave(&prev_ring->lock, flags);
+
+ prev_ring->active_time += jiffies_delta_to_msecs(jiffies -
+ prev_ring->last_ts);
+
+ spin_unlock_irqrestore(&prev_ring->lock, flags);
+
+ /*
+ * For the incoming ring(cur_ring), save the new current timestamp to
+ * restart active time measurement
+ */
+ spin_lock_irqsave(&cur_ring->lock, flags);
+
+ cur_ring->last_ts = jiffies_to_msecs(jiffies);
+
+ spin_unlock_irqrestore(&cur_ring->lock, flags);
+}
+
void a5xx_preempt_irq(struct msm_gpu *gpu)
{
uint32_t status;
@@ -194,6 +221,8 @@ void a5xx_preempt_irq(struct msm_gpu *gpu)
return;
}
+ update_ring_timestamps(a5xx_gpu->cur_ring, a5xx_gpu->next_ring);
+
a5xx_gpu->cur_ring = a5xx_gpu->next_ring;
a5xx_gpu->next_ring = NULL;
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 17d0506..f8b5f4a 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -212,6 +212,9 @@ int adreno_hw_init(struct msm_gpu *gpu)
/* reset completed fence seqno: */
ring->memptrs->fence = ring->seqno;
ring->memptrs->rptr = 0;
+
+ ring->last_ts = 0;
+ ring->active_time = 0;
}
/*
diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.h b/drivers/gpu/drm/msm/msm_ringbuffer.h
index 10ae4a8..27e0ab2 100644
--- a/drivers/gpu/drm/msm/msm_ringbuffer.h
+++ b/drivers/gpu/drm/msm/msm_ringbuffer.h
@@ -46,6 +46,8 @@ struct msm_ringbuffer {
struct mutex fence_idr_lock;
spinlock_t lock;
struct drm_gpu_scheduler sched;
+ u32 last_ts;
+ u32 active_time;
};
struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int id,
diff --git a/drivers/gpu/drm/msm/msm_sched.c b/drivers/gpu/drm/msm/msm_sched.c
index 8b805ce..70b7713 100644
--- a/drivers/gpu/drm/msm/msm_sched.c
+++ b/drivers/gpu/drm/msm/msm_sched.c
@@ -191,6 +191,9 @@ static void msm_sched_timedout_job(struct drm_sched_job *bad_job)
struct msm_gem_submit *submit = to_msm_gem_submit(bad_job);
struct msm_gpu *gpu = submit->gpu;
struct msm_ringbuffer *ring = submit->ring;
+ struct drm_gpu_scheduler *sched = &ring->sched;
+ unsigned long flags;
+ u32 total_time = 0;
/*
* If this submission completed in the mean time, then the timeout is
@@ -199,6 +202,23 @@ static void msm_sched_timedout_job(struct drm_sched_job *bad_job)
if (submit->seqno <= submit->ring->memptrs->fence)
return;
+ spin_lock_irqsave(&ring->lock, flags);
+
+ total_time = ring->active_time;
+
+ /* Measure the last sample only if this is the active ring */
+ if (ring == gpu->funcs->active_ring(gpu))
+ total_time += jiffies_delta_to_msecs(jiffies - ring->last_ts);
+
+ spin_unlock_irqrestore(&ring->lock, flags);
+
+ if (total_time < sched->timeout) {
+ schedule_delayed_work(&bad_job->work_tdr,
+ msecs_to_jiffies(sched->timeout - total_time));
+ return;
+ }
+
+ /* Timeout occurred, go for a recovery */
dev_err(&gpu->pdev->dev, "%s: hangcheck detected gpu lockup rb %d!\n",
gpu->name, ring->id);
dev_err(&gpu->pdev->dev, "%s: completed fence: %u\n",
@@ -231,11 +251,33 @@ static void msm_sched_free_job(struct drm_sched_job *sched_job)
msm_gem_submit_free(submit);
}
+static void msm_sched_timeout_start(struct drm_sched_job *sched_job)
+{
+ struct msm_gem_submit *submit = to_msm_gem_submit(sched_job);
+ struct msm_gpu *gpu = submit->gpu;
+ struct msm_ringbuffer *ring = submit->ring;
+ unsigned long flags;
+
+ spin_lock_irqsave(&ring->lock, flags);
+
+ ring->active_time = 0;
+
+ /*
+ * Save the initial timestamp only if this ring is active. For other
+ * rings the initial timestamp is captured at preemption switch-in
+ */
+ if (ring == gpu->funcs->active_ring(gpu))
+ ring->last_ts = jiffies_to_msecs(jiffies);
+
+ spin_unlock_irqrestore(&ring->lock, flags);
+}
+
static const struct drm_sched_backend_ops msm_sched_ops = {
.dependency = msm_sched_dependency,
.run_job = msm_sched_run_job,
.timedout_job = msm_sched_timedout_job,
.free_job = msm_sched_free_job,
+ .timeout_start_notify = msm_sched_timeout_start,
};
int msm_sched_job_init(struct drm_sched_job *sched_job)
--
1.9.1
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
prev parent reply other threads:[~2018-10-01 12:31 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-01 12:31 [PATCH 00/13] drm/msm: Hook up the DRM gpu scheduler Sharat Masetty
[not found] ` <1538397105-19581-1-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 12:31 ` [PATCH 01/13] drm/msm: Track GPU fences with idr Sharat Masetty
[not found] ` <1538397105-19581-2-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 19:03 ` Jordan Crouse
[not found] ` <20181001190333.GE31641-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-01 21:49 ` Rob Clark
2018-10-01 12:31 ` [PATCH 02/13] drm/msm: Change msm_gpu_submit() API Sharat Masetty
[not found] ` <1538397105-19581-3-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 18:00 ` Jordan Crouse
2018-10-01 12:31 ` [PATCH 03/13] drm/msm: Save the ring name in the ring structure Sharat Masetty
[not found] ` <1538397105-19581-4-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 18:01 ` Jordan Crouse
2018-10-01 12:31 ` [PATCH 04/13] drm/msm: Change the name of the fence to hw_fence Sharat Masetty
2018-10-01 12:31 ` [PATCH 05/13] drm/msm: rearrange submit buffer objects clean up Sharat Masetty
2018-10-01 12:31 ` [PATCH 06/13] drm/msm: Use kzalloc for submit struct allocation Sharat Masetty
[not found] ` <1538397105-19581-7-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 18:13 ` Jordan Crouse
2018-10-03 10:50 ` [Freedreno] " Sharat Masetty
2018-10-01 12:31 ` [PATCH 07/13] drm/msm: Fix leak in submitqueue create Sharat Masetty
2018-10-01 12:31 ` [PATCH 08/13] drm/scheduler: set sched->thread to NULL in failure Sharat Masetty
2018-10-01 12:31 ` [PATCH 09/13] drm/msm: Use the DRM common Scheduler Sharat Masetty
[not found] ` <1538397105-19581-10-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-01 19:02 ` Jordan Crouse
2018-10-03 10:43 ` Sharat Masetty
2018-10-01 12:31 ` [PATCH 10/13] msm/drm: Remove unused code Sharat Masetty
2018-10-01 12:31 ` [PATCH 11/13] drm/scheduler: Add a timeout_start_notify function op Sharat Masetty
2018-10-01 12:31 ` [PATCH 12/13] jiffies: add utility function to calculate delta in ms Sharat Masetty
2018-10-01 12:31 ` Sharat Masetty [this message]
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=1538397105-19581-14-git-send-email-smasetty@codeaurora.org \
--to=smasetty-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/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