From: Sharat Masetty <smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: Christian.Koenig-5C7GfCeVMHo@public.gmane.org,
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] drm/scheduler: Add drm_sched_suspend/resume timeout functions
Date: Thu, 8 Nov 2018 19:12:34 +0530 [thread overview]
Message-ID: <1541684554-17115-1-git-send-email-smasetty@codeaurora.org> (raw)
Hi Christian,
Can you please review this patch? It is a continuation of the discussion at [1].
At first I was thinking of using a cancel for suspend instead of a mod(to an
arbitrarily large value), but I couldn't get it to fit in as I have an additional
constraint of being able to call these functions from an IRQ context.
These new functions race with other contexts, primarily finish_job(),
timedout_job() and recovery(), but I did go through the possible races between
these(I think). Please let me know what you think of this? I have not tested
this yet and if this is something in the right direction, I will put this
through my testing drill and polish it.
IMO I think I prefer the callback approach as it appears to be simple, less
error prone for both the scheduler and the drivers.
[1] https://patchwork.freedesktop.org/patch/259914/
Signed-off-by: Sharat Masetty <smasetty@codeaurora.org>
---
drivers/gpu/drm/scheduler/sched_main.c | 81 +++++++++++++++++++++++++++++++++-
include/drm/gpu_scheduler.h | 5 +++
2 files changed, 85 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index c993d10..9645789 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -191,11 +191,84 @@ bool drm_sched_dependency_optimized(struct dma_fence* fence,
*/
static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
{
+ unsigned long flags;
+
+ spin_lock_irqsave(&sched->tdr_suspend_lock, flags);
+
+ sched->timeout_remaining = sched->timeout;
+
if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
- !list_empty(&sched->ring_mirror_list))
+ !list_empty(&sched->ring_mirror_list) && !sched->work_tdr_suspended)
schedule_delayed_work(&sched->work_tdr, sched->timeout);
+
+ spin_unlock_irqrestore(&sched->tdr_suspend_lock, flags);
}
+/**
+ * drm_sched_suspend_timeout - suspend timeout for reset worker
+ *
+ * @sched: scheduler instance for which to suspend the timeout
+ *
+ * Suspend the delayed work timeout for the scheduler. Note that
+ * this function can be called from an IRQ context.
+ */
+void drm_sched_suspend_timeout(struct drm_gpu_scheduler *sched)
+{
+ unsigned long flags, timeout;
+
+ spin_lock_irqsave(&sched->tdr_suspend_lock, flags);
+
+ if (sched->work_tdr_suspended ||
+ sched->timeout == MAX_SCHEDULE_TIMEOUT ||
+ list_empty(&sched->ring_mirror_list))
+ goto done;
+
+ timeout = sched->work_tdr.timer.expires;
+
+ /*
+ * Reset timeout to an arbitrarily large value
+ */
+ mod_delayed_work(system_wq, &sched->work_tdr, sched->timeout * 10);
+
+ timeout -= jiffies;
+
+ /* FIXME: Can jiffies be after timeout? */
+ sched->timeout_remaining = time_after(jiffies, timeout)? 0: timeout;
+ sched->work_tdr_suspended = true;
+
+done:
+ spin_unlock_irqrestore(&sched->tdr_suspend_lock, flags);
+}
+EXPORT_SYMBOL(drm_sched_suspend_timeout);
+
+/**
+ * drm_sched_resume_timeout - resume timeout for reset worker
+ *
+ * @sched: scheduler instance for which to resume the timeout
+ *
+ * Resume the delayed work timeout for the scheduler. Note that
+ * this function can be called from an IRQ context.
+ */
+void drm_sched_resume_timeout(struct drm_gpu_scheduler *sched)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&sched->tdr_suspend_lock, flags);
+
+ if (!sched->work_tdr_suspended ||
+ sched->timeout == MAX_SCHEDULE_TIMEOUT) {
+ spin_unlock_irqrestore(&sched->tdr_suspend_lock, flags);
+ return;
+ }
+
+ mod_delayed_work(system_wq, &sched->work_tdr, sched->timeout_remaining);
+
+ sched->work_tdr_suspended = false;
+
+ spin_unlock_irqrestore(&sched->tdr_suspend_lock, flags);
+}
+EXPORT_SYMBOL(drm_sched_resume_timeout);
+
/* job_finish is called after hw fence signaled
*/
static void drm_sched_job_finish(struct work_struct *work)
@@ -348,6 +421,11 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched)
struct drm_sched_job *s_job, *tmp;
bool found_guilty = false;
int r;
+ unsigned long flags;
+
+ spin_lock_irqsave(&sched->tdr_suspend_lock, flags);
+ sched->work_tdr_suspended = false;
+ spin_unlock_irqrestore(&sched->tdr_suspend_lock, flags);
spin_lock(&sched->job_list_lock);
list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
@@ -607,6 +685,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
init_waitqueue_head(&sched->job_scheduled);
INIT_LIST_HEAD(&sched->ring_mirror_list);
spin_lock_init(&sched->job_list_lock);
+ spin_lock_init(&sched->tdr_suspend_lock);
atomic_set(&sched->hw_rq_count, 0);
INIT_DELAYED_WORK(&sched->work_tdr, drm_sched_job_timedout);
atomic_set(&sched->num_jobs, 0);
diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
index d87b268..5d39572 100644
--- a/include/drm/gpu_scheduler.h
+++ b/include/drm/gpu_scheduler.h
@@ -278,6 +278,9 @@ struct drm_gpu_scheduler {
atomic_t hw_rq_count;
atomic64_t job_id_count;
struct delayed_work work_tdr;
+ unsigned long timeout_remaining;
+ bool work_tdr_suspended;
+ spinlock_t tdr_suspend_lock;
struct task_struct *thread;
struct list_head ring_mirror_list;
spinlock_t job_list_lock;
@@ -300,6 +303,8 @@ void drm_sched_hw_job_reset(struct drm_gpu_scheduler *sched,
bool drm_sched_dependency_optimized(struct dma_fence* fence,
struct drm_sched_entity *entity);
void drm_sched_job_kickout(struct drm_sched_job *s_job);
+void drm_sched_suspend_timeout(struct drm_gpu_scheduler *sched);
+void drm_sched_resume_timeout(struct drm_gpu_scheduler *sched);
void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
struct drm_sched_entity *entity);
--
1.9.1
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
next reply other threads:[~2018-11-08 13:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-08 13:42 Sharat Masetty [this message]
[not found] ` <1541684554-17115-1-git-send-email-smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-11-08 14:41 ` [PATCH] drm/scheduler: Add drm_sched_suspend/resume timeout functions Koenig, Christian
[not found] ` <75831be1-c6b1-80d7-d594-651712f05b00-5C7GfCeVMHo@public.gmane.org>
2018-11-14 17:29 ` Sharat Masetty
[not found] ` <f1934de9-8568-4e38-75ca-61f26de5bfb6-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-11-14 19:03 ` Koenig, Christian
2018-11-15 9:36 ` Sharat Masetty
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=1541684554-17115-1-git-send-email-smasetty@codeaurora.org \
--to=smasetty-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
--cc=Christian.Koenig-5C7GfCeVMHo@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