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+")
Signed-off-by: Maíra Canal <[email protected]>
---
 drivers/gpu/drm/v3d/v3d_drv.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 
8de4f151a5c02cbf970e72933d1a275968088357..acdfd43af9ee4b66bf7c39ba8160106e4726738a
 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -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(sizeof(*v3d_priv), GFP_KERNEL);
        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

-- 
2.52.0

Reply via email to