]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/panthor: Defer scheduler entitiy destruction to queue release
authorAdrián Larumbe <adrian.larumbe@collabora.com>
Fri, 19 Sep 2025 16:43:48 +0000 (17:43 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Oct 2025 11:48:34 +0000 (13:48 +0200)
[ Upstream commit 7d9c3442b02ab7dd3c44e20095a178fd57d2eccb ]

Commit de8548813824 ("drm/panthor: Add the scheduler logical block")
handled destruction of a group's queues' drm scheduler entities early
into the group destruction procedure.

However, that races with the group submit ioctl, because by the time
entities are destroyed (through the group destroy ioctl), the submission
procedure might've already obtained a group handle, and therefore the
ability to push jobs into entities. This is met with a DRM error message
within the drm scheduler core as a situation that should never occur.

Fix by deferring drm scheduler entity destruction to queue release time.

Fixes: de8548813824 ("drm/panthor: Add the scheduler logical block")
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Steven Price <steven.price@arm.com>
Link: https://lore.kernel.org/r/20250919164436.531930-1-adrian.larumbe@collabora.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/panthor/panthor_sched.c

index 43ee57728de543926aec80d4f6c3417b21fb7435..e927d80d6a2af9eadb798a3f379b191cf6e8bbda 100644 (file)
@@ -886,8 +886,7 @@ static void group_free_queue(struct panthor_group *group, struct panthor_queue *
        if (IS_ERR_OR_NULL(queue))
                return;
 
-       if (queue->entity.fence_context)
-               drm_sched_entity_destroy(&queue->entity);
+       drm_sched_entity_destroy(&queue->entity);
 
        if (queue->scheduler.ops)
                drm_sched_fini(&queue->scheduler);
@@ -3558,11 +3557,6 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)
        if (!group)
                return -EINVAL;
 
-       for (u32 i = 0; i < group->queue_count; i++) {
-               if (group->queues[i])
-                       drm_sched_entity_destroy(&group->queues[i]->entity);
-       }
-
        mutex_lock(&sched->reset.lock);
        mutex_lock(&sched->lock);
        group->destroyed = true;