mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 11:02:03 +02:00
drm/nouveau: RCU-free the scheduler-containing nouveau_sched
struct nouveau_sched embeds a struct drm_gpu_scheduler (base).
nouveau_sched_destroy() calls nouveau_sched_fini() (which does
drm_sched_fini(&sched->base)) and then frees the object with plain
kfree(sched).
drm_sched_fence_get_timeline_name() returns fence->sched->name, and the
scheduler fence keeps a .release callback so it is not ops-detached on
signalling. A finished fence exported to userspace via drm_syncobj /
sync_file therefore keeps pointing at &sched->base after nouveau_sched_destroy(),
and a later get_timeline_name() -- reachable unprivileged through
SYNC_IOC_FILE_INFO -- dereferences freed memory (KASAN slab-use-after-free
read).
Per the dma-fence lifetime contract the exporter must keep the data backing a
signalled fence alive for an RCU grace period. Free the scheduler-containing
object with kfree_rcu() instead of kfree().
Fixes: 5f03a507b2 ("drm/nouveau: implement 1:1 scheduler - entity relationship")
Cc: stable@vger.kernel.org
Signed-off-by: Jonghyuk Kim(MalHyuk) <malhyuk97@gmail.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patch.msgid.link/20260902012717.880724-1-malhyuk97@gmail.com
This commit is contained in:
parent
3359a372ef
commit
f7eae6d8d7
|
|
@ -517,7 +517,7 @@ nouveau_sched_destroy(struct nouveau_sched **psched)
|
|||
struct nouveau_sched *sched = *psched;
|
||||
|
||||
nouveau_sched_fini(sched);
|
||||
kfree(sched);
|
||||
kfree_rcu(sched, rcu);
|
||||
|
||||
*psched = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ void nouveau_job_free(struct nouveau_job *job);
|
|||
|
||||
struct nouveau_sched {
|
||||
struct drm_gpu_scheduler base;
|
||||
struct rcu_head rcu;
|
||||
struct drm_sched_entity entity;
|
||||
struct workqueue_struct *wq;
|
||||
struct mutex mutex;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user