Diverging requirements between GPU drivers using firmware scheduling
and those using hardware scheduling have shown that drm_gpu_scheduler is
no longer sufficient for firmware-scheduled GPU drivers. The technical
debt, lack of memory-safety guarantees, absence of clear object-lifetime
rules, and numerous driver-specific hacks have rendered
drm_gpu_scheduler unmaintainable. It is time for a fresh design for
firmware-scheduled GPU drivers—one that addresses all of the
aforementioned shortcomings.
Key changes from DRM scheduler:
- Unification of drm_gpu_scheduler, drm_sched_entity into
drm_dep_queue
- Reference counting
- Clear object-lifetime ownership
- Privatisation of drm dep fence
- Drop scheduled fence from drm dep fence
- Submit workqueue bypass path (optional)
- IRQ removal of jobs (i.e., bypass worker to drop ref to job)
(optional)
- Asynchronous teardown
- Extensive lockdep annotations and asserts
- Extensive kernel doc
Xe has been fully converted to drm dep and extensively tested with and
without verbose kernel debug Kconfig options. Everything seems to be
working locally. All permutations of drm_dep_queue_flags tested.
Compile tested only conversions - Panthor and AMDXDNA.
Other candidates to convert are: Nouveau, PVR, and AMDGPU VM queue.
Forward looking - this design seems suitable for Rust bindings and use
by Nova, Tyr given the clean object-lifetime rules and reference
counting.
The Xe team is aligned on moving forward with this; hopefully the rest
of the community embraces it.
In addition to DRM dep, workqueues have been updated with interfaces to
enforce reclaim safety with DRM dep, and Xe is utilizing these interfaces.
This part could be split out into a separate series.
I'm also fairly certain that a sane HW queue component could be built on
top of DRM dep as well, replacing DRM sched for all drivers they choose.
Matt
Matthew Brost (12):
workqueue: Add interface to teach lockdep to warn on reclaim
violations
drm/dep: Add DRM dependency queue layer
drm/xe: Use WQ_MEM_WARN_ON_RECLAIM on all workqueues in the reclaim
path
drm/xe: Issue GGTT invalidation under lock in ggtt_node_remove
drm/xe: Return fence from xe_sched_job_arm and adjust job references
drm/xe: Convert to DRM dep queue scheduler layer
drm/xe: Make scheduler message lock IRQ-safe
drm/xe: Rework exec queue object on top of DRM dep
drm/xe: Enable IRQ job put in DRM dep
drm/xe: Use DRM dep queue kill semantics
accel/amdxdna: Convert to drm_dep scheduler layer
drm/panthor: Convert to drm_dep scheduler layer
drivers/accel/amdxdna/Kconfig | 2 +-
drivers/accel/amdxdna/aie2_ctx.c | 144 +-
drivers/accel/amdxdna/aie2_pci.h | 4 +-
drivers/accel/amdxdna/amdxdna_ctx.c | 5 +-
drivers/accel/amdxdna/amdxdna_ctx.h | 4 +-
drivers/gpu/drm/Kconfig | 4 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/dep/Makefile | 5 +
drivers/gpu/drm/dep/drm_dep_fence.c | 406 +++++
drivers/gpu/drm/dep/drm_dep_fence.h | 25 +
drivers/gpu/drm/dep/drm_dep_job.c | 675 +++++++
drivers/gpu/drm/dep/drm_dep_job.h | 13 +
drivers/gpu/drm/dep/drm_dep_queue.c | 1647 ++++++++++++++++++
drivers/gpu/drm/dep/drm_dep_queue.h | 31 +
drivers/gpu/drm/panthor/Kconfig | 2 +-
drivers/gpu/drm/panthor/panthor_device.c | 5 +-
drivers/gpu/drm/panthor/panthor_device.h | 2 +-
drivers/gpu/drm/panthor/panthor_drv.c | 35 +-
drivers/gpu/drm/panthor/panthor_mmu.c | 160 +-
drivers/gpu/drm/panthor/panthor_mmu.h | 14 +-
drivers/gpu/drm/panthor/panthor_sched.c | 242 ++-
drivers/gpu/drm/panthor/panthor_sched.h | 12 +-
drivers/gpu/drm/xe/Kconfig | 2 +-
drivers/gpu/drm/xe/tests/xe_migrate.c | 10 +-
drivers/gpu/drm/xe/xe_dep_job_types.h | 8 +-
drivers/gpu/drm/xe/xe_dep_scheduler.c | 81 +-
drivers/gpu/drm/xe/xe_dep_scheduler.h | 7 +-
drivers/gpu/drm/xe/xe_device.c | 3 +-
drivers/gpu/drm/xe/xe_exec.c | 12 +-
drivers/gpu/drm/xe/xe_exec_queue.c | 96 +-
drivers/gpu/drm/xe/xe_exec_queue.h | 9 +-
drivers/gpu/drm/xe/xe_exec_queue_types.h | 10 +-
drivers/gpu/drm/xe/xe_execlist.c | 39 +-
drivers/gpu/drm/xe/xe_execlist_types.h | 4 -
drivers/gpu/drm/xe/xe_ggtt.c | 12 +-
drivers/gpu/drm/xe/xe_gpu_scheduler.c | 66 +-
drivers/gpu/drm/xe/xe_gpu_scheduler.h | 67 +-
drivers/gpu/drm/xe/xe_gpu_scheduler_types.h | 9 +-
drivers/gpu/drm/xe/xe_gsc.c | 5 +-
drivers/gpu/drm/xe/xe_gsc_submit.c | 5 +-
drivers/gpu/drm/xe/xe_gt.c | 8 +-
drivers/gpu/drm/xe/xe_guc_ct.c | 3 +-
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 14 +-
drivers/gpu/drm/xe/xe_guc_submit.c | 360 ++--
drivers/gpu/drm/xe/xe_migrate.c | 27 +-
drivers/gpu/drm/xe/xe_oa.c | 5 +-
drivers/gpu/drm/xe/xe_pt.c | 2 +-
drivers/gpu/drm/xe/xe_pxp_submit.c | 10 +-
drivers/gpu/drm/xe/xe_sched_job.c | 59 +-
drivers/gpu/drm/xe/xe_sched_job.h | 9 +-
drivers/gpu/drm/xe/xe_sched_job_types.h | 8 +-
drivers/gpu/drm/xe/xe_sync.c | 2 +-
drivers/gpu/drm/xe/xe_tlb_inval.c | 3 +-
drivers/gpu/drm/xe/xe_tlb_inval_job.c | 86 +-
include/drm/drm_dep.h | 597 +++++++
include/linux/workqueue.h | 3 +
include/trace/events/amdxdna.h | 12 +-
kernel/workqueue.c | 41 +
58 files changed, 4268 insertions(+), 864 deletions(-)
create mode 100644 drivers/gpu/drm/dep/Makefile
create mode 100644 drivers/gpu/drm/dep/drm_dep_fence.c
create mode 100644 drivers/gpu/drm/dep/drm_dep_fence.h
create mode 100644 drivers/gpu/drm/dep/drm_dep_job.c
create mode 100644 drivers/gpu/drm/dep/drm_dep_job.h
create mode 100644 drivers/gpu/drm/dep/drm_dep_queue.c
create mode 100644 drivers/gpu/drm/dep/drm_dep_queue.h
create mode 100644 include/drm/drm_dep.h
--
2.34.1