Skip to content

Commit 555eb89

Browse files
mairacanalgregkh
authored andcommitted
drm/v3d: Handle error from drm_sched_entity_init()
[ Upstream commit 8cf1bec ] 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: 57692c9 ("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent cb54064 commit 555eb89

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

drivers/gpu/drm/v3d/v3d_drv.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
130130
struct v3d_dev *v3d = to_v3d_dev(dev);
131131
struct v3d_file_priv *v3d_priv;
132132
struct drm_gpu_scheduler *sched;
133-
int i;
133+
int i, ret;
134134

135135
v3d_priv = kzalloc(sizeof(*v3d_priv), GFP_KERNEL);
136136
if (!v3d_priv)
@@ -140,9 +140,11 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
140140

141141
for (i = 0; i < V3D_MAX_QUEUES; i++) {
142142
sched = &v3d->queue[i].sched;
143-
drm_sched_entity_init(&v3d_priv->sched_entity[i],
144-
DRM_SCHED_PRIORITY_NORMAL, &sched,
145-
1, NULL);
143+
ret = drm_sched_entity_init(&v3d_priv->sched_entity[i],
144+
DRM_SCHED_PRIORITY_NORMAL, &sched,
145+
1, NULL);
146+
if (ret)
147+
goto err_sched;
146148

147149
memset(&v3d_priv->stats[i], 0, sizeof(v3d_priv->stats[i]));
148150
seqcount_init(&v3d_priv->stats[i].lock);
@@ -152,6 +154,12 @@ v3d_open(struct drm_device *dev, struct drm_file *file)
152154
file->driver_priv = v3d_priv;
153155

154156
return 0;
157+
158+
err_sched:
159+
for (i--; i >= 0; i--)
160+
drm_sched_entity_destroy(&v3d_priv->sched_entity[i]);
161+
kfree(v3d_priv);
162+
return ret;
155163
}
156164

157165
static void

0 commit comments

Comments
 (0)