]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/v3d: Handle error from drm_sched_entity_init()
authorMaíra Canal <mcanal@igalia.com>
Fri, 6 Mar 2026 11:30:33 +0000 (08:30 -0300)
committerMaíra Canal <mcanal@igalia.com>
Fri, 13 Mar 2026 21:02:27 +0000 (18:02 -0300)
drm_sched_entity_init() can fail but its return value is currently being
ignored in v3d_open(). Check the return value and properly unwind
on failure by destroying any already-initialized scheduler entities.

Fixes: 57692c94dcbe ("drm/v3d: Introduce a new DRM driver for Broadcom V3D V3.x+")
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Link: https://patch.msgid.link/20260306-v3d-reset-locking-improv-v3-1-49864fe00692@igalia.com
Signed-off-by: Maíra Canal <mcanal@igalia.com>
drivers/gpu/drm/v3d/v3d_drv.c

index dd60acdf52c2b2e44c6150f11678b291ab1f6df4..86e05fcf6cf65638c4bf97ab3511ccac40f21e2f 100644 (file)
@@ -131,7 +131,7 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
        struct v3d_dev *v3d = to_v3d_dev(dev);
        struct v3d_file_priv *v3d_priv;
        struct drm_gpu_scheduler *sched;
-       int i;
+       int i, ret;
 
        v3d_priv = kzalloc_obj(*v3d_priv);
        if (!v3d_priv)
@@ -141,9 +141,11 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
 
        for (i = 0; i < V3D_MAX_QUEUES; i++) {
                sched = &v3d->queue[i].sched;
-               drm_sched_entity_init(&v3d_priv->sched_entity[i],
-                                     DRM_SCHED_PRIORITY_NORMAL, &sched,
-                                     1, NULL);
+               ret = drm_sched_entity_init(&v3d_priv->sched_entity[i],
+                                           DRM_SCHED_PRIORITY_NORMAL, &sched,
+                                           1, NULL);
+               if (ret)
+                       goto err_sched;
 
                memset(&v3d_priv->stats[i], 0, sizeof(v3d_priv->stats[i]));
                seqcount_init(&v3d_priv->stats[i].lock);
@@ -153,6 +155,12 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
        file->driver_priv = v3d_priv;
 
        return 0;
+
+err_sched:
+       for (i--; i >= 0; i--)
+               drm_sched_entity_destroy(&v3d_priv->sched_entity[i]);
+       kfree(v3d_priv);
+       return ret;
 }
 
 static void