mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 07:33:19 +02:00
drm/v3d: Handle error from drm_sched_entity_init()
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: 57692c94dc ("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>
This commit is contained in:
parent
235b333e28
commit
8cf1bec37b
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user