diff options
| author | Maíra Canal <mcanal@igalia.com> | 2026-04-02 22:32:35 +0300 |
|---|---|---|
| committer | Christian Gmeiner <cgmeiner@igalia.com> | 2026-05-05 12:40:16 +0300 |
| commit | 3780c41460a9ad6d5d4c09a416765c6cc285033b (patch) | |
| tree | f2cf82eb8b3ddcd881429e736d2fabbf18bf9a44 /include/linux/platform_data | |
| parent | 84ae1840260fece9b6b70d3872b79384bbe5a90b (diff) | |
| download | linux-3780c41460a9ad6d5d4c09a416765c6cc285033b.tar.xz | |
drm/etnaviv: Fix armed job not being pushed to the DRM scheduler
When xa_alloc_cyclic() failed in etnaviv_sched_push_job(), the error
path skipped drm_sched_entity_push_job(). This is a violation of the DRM
scheduler contract, as once a job has been armed with drm_sched_job_arm(),
it must be pushed with drm_sched_entity_push_job(). From the DRM
scheduler documentation,
"""
drm_sched_job_arm() is a point of no return since it initializes the
fences and their sequence number etc. Once that function has been called,
you *must* submit it with drm_sched_entity_push_job() and cannot simply
abort it by calling drm_sched_job_cleanup().
"""
Fix this by splitting the fence ID allocation into two phases: first,
alloc an xarray slot before arming the job (which can fail), then fill in
the actual fence with xa_store() after arming. This way, allocation
failures are handled before the job is armed, and once armed, the job is
always pushed to the scheduler.
This also fixes a double call to drm_sched_job_cleanup(), as both
etnaviv_sched_push_job() and its caller would call it on failure.
Fixes: 764be12345c3 ("drm/etnaviv: convert user fence tracking to XArray")
Signed-off-by: Maíra Canal <mcanal@igalia.com>
Link: https://patch.msgid.link/20260402193424.2023318-1-mcanal@igalia.com
Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com>
Diffstat (limited to 'include/linux/platform_data')
0 files changed, 0 insertions, 0 deletions
