drm/sched: Call drm_sched_fence_set_parent() from drm_sched_fence_scheduled()
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 23 Jun 2023 07:52:04 +0000 (09:52 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Mon, 26 Jun 2023 07:45:25 +0000 (09:45 +0200)
commitdb8b4968a8d0e86c0f8bd7541359a4111a5b39ad
treef70fd21e6891b64a365d9b8057dc01278536faa4
parent8fb3e25c3dd1a2755c848ce7488c2f06a9fb9f97
drm/sched: Call drm_sched_fence_set_parent() from drm_sched_fence_scheduled()

Drivers that can delegate waits to the firmware/GPU pass the scheduled
fence to drm_sched_job_add_dependency(), and issue wait commands to
the firmware/GPU at job submission time. For this to be possible, they
need all their 'native' dependencies to have a valid parent since this
is where the actual HW fence information are encoded.

In drm_sched_main(), we currently call drm_sched_fence_set_parent()
after drm_sched_fence_scheduled(), leaving a short period of time
during which the job depending on this fence can be submitted.

Since setting parent and signaling the fence are two things that are
kinda related (you can't have a parent if the job hasn't been scheduled),
it probably makes sense to pass the parent fence to
drm_sched_fence_scheduled() and let it call drm_sched_fence_set_parent()
before it signals the scheduled fence.

Here is a detailed description of the race we are fixing here:

Thread A Thread B

- calls drm_sched_fence_scheduled()
- signals s_fence->scheduled which
  wakes up thread B

- entity dep signaled, checking
  the next dep
- no more deps waiting
- entity is picked for job
  submission by drm_gpu_scheduler
- run_job() is called
- run_job() tries to
  collect native fence info from
  s_fence->parent, but it's
  NULL =>
  BOOM, we can't do our native
  wait

- calls drm_sched_fence_set_parent()

v2:
* Fix commit message

v3:
* Add a detailed description of the race to the commit message
* Add Luben's R-b

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Frank Binns <frank.binns@imgtec.com>
Cc: Sarah Walker <sarah.walker@imgtec.com>
Cc: Donald Robson <donald.robson@imgtec.com>
Cc: Luben Tuikov <luben.tuikov@amd.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: "Christian König" <christian.koenig@amd.com>
Reviewed-by: Luben Tuikov <luben.tuikov@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230623075204.382350-1-boris.brezillon@collabora.com
drivers/gpu/drm/scheduler/sched_fence.c
drivers/gpu/drm/scheduler/sched_main.c
include/drm/gpu_scheduler.h