drm/panthor: fix queue_reset_timeout_locked
Subsystems (3)
PATCH 1/1 drm/panthor: fix queue_reset_timeout_locked
queue_check_job_completion calls queue_reset_timeout_locked to reset the timeout when progress is made. We want the reset to happen when the timeout is running, not when it is suspended.
Fixes 345c5b7cc0f85 ("drm/panthor: Make the timeout per-queue instead of per-job")
Signed-off-by Chia-I Wu <[email protected]>
--- drivers/gpu/drm/panthor/panthor_sched.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/gpu/drm/panthor/panthor_sched.c +12 -12
@@ -1052,18 +1052,6 @@ group_is_idle(struct panthor_group *group)return hweight32 (inactive_queues) == group->queue_count; } -static void -queue_reset_timeout_locked (struct panthor_queue *queue) -{ -lockdep_assert_held (&queue->fence_ctx.lock); - -if (queue->timeout.remaining !=MAX_SCHEDULE_TIMEOUT ) { -mod_delayed_work (queue->scheduler.timeout_wq, - &queue->timeout.work, -msecs_to_jiffies (JOB_TIMEOUT_MS )); - } -} -static bool group_can_run (struct panthor_group *group) {
@@ -1080,6 +1068,18 @@ queue_timeout_is_suspended(struct panthor_queue *queue)return queue->timeout.remaining !=MAX_SCHEDULE_TIMEOUT ; } +static void +queue_reset_timeout_locked (struct panthor_queue *queue) +{ +lockdep_assert_held (&queue->fence_ctx.lock); + +if (!queue_timeout_is_suspended (queue)) { +mod_delayed_work (queue->scheduler.timeout_wq, + &queue->timeout.work, +msecs_to_jiffies (JOB_TIMEOUT_MS )); + } +} +static void queue_suspend_timeout_locked (struct panthor_queue *queue) {
Signature · 1 line
2.52.0.158.g65b55ccf14-goog
Boris Brezillon
maintainerQuoted 37 lines · On Tue, 2 Dec 2025 09:40:28 -0800 Chia-I Wu <[email protected]> wrote:
queue_check_job_completioncallsqueue_reset_timeout_lockedto reset the timeout when progress is made. We want the reset to happen when the timeout is running, not when it is suspended.Fixes 345c5b7cc0f85 ("drm/panthor: Make the timeout per-queue instead of per-job")Signed-off-by Chia-I Wu <[email protected]>--- drivers/gpu/drm/panthor/panthor_sched.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)drivers/gpu/drm/panthor/panthor_sched.c +0
-12@@ -1052,18 +1052,6 @@ group_is_idle(struct panthor_group *group)return hweight32 (inactive_queues) == group->queue_count; } -static void -queue_reset_timeout_locked (struct panthor_queue *queue) -{ -lockdep_assert_held (&queue->fence_ctx.lock); - -if (queue->timeout.remaining !=MAX_SCHEDULE_TIMEOUT ) { -mod_delayed_work (queue->scheduler.timeout_wq, - &queue->timeout.work, -msecs_to_jiffies (JOB_TIMEOUT_MS )); - } -} -static bool group_can_run (struct panthor_group *group) {@@ -1080,6 +1068,18 @@ queue_timeout_is_suspended(struct panthor_queue *queue)return queue->timeout.remaining !=MAX_SCHEDULE_TIMEOUT ; }
drivers/gpu/drm/panthor/panthor_sched.c queue_timeout_is_suspended(struct panthor_queue *queue) · line 1080
Quoted 10 lines
drivers/gpu/drm/panthor/panthor_sched.c +10
-0+static void +queue_reset_timeout_locked (struct panthor_queue *queue) +{ +lockdep_assert_held (&queue->fence_ctx.lock); + +if (!queue_timeout_is_suspended (queue)) { +mod_delayed_work (queue->scheduler.timeout_wq, + &queue->timeout.work, +msecs_to_jiffies (JOB_TIMEOUT_MS )); + }
Oops. If queue_reset_timeout_locked() is called in a context where the timeout is suspended, shouldn't we adjust the remaining value?
static voidqueue_reset_timeout_locked(struct panthor_queue *queue)
{
lockdep_assert_held(&queue->fence_ctx.lock);
if (queue_timeout_is_suspended(queue)) {
queue->timeout.remaining = msecs_to_jiffies(JOB_TIMEOUT_MS);
} else {
mod_delayed_work(queue->scheduler.timeout_wq,
&queue->timeout.work,
msecs_to_jiffies(JOB_TIMEOUT_MS));
}
}Quoted 5 lines
drivers/gpu/drm/panthor/panthor_sched.c +2
-0+} +static void queue_suspend_timeout_locked (struct panthor_queue *queue) {