When a GPU dma-fence signals, drivers often need to perform work that cannot run in IRQ context. This pattern is currently open-coded in multiple drivers.
This series introduces two layered helpers: Patch 1 introduces drm_work_fence — a generic embeddable base structure that handles the dma-fence-callback-to-workqueue pattern. Any driver needing deferred fence work can use this directly. Patch 2 introduces drm_user_fence — a thin layer on top of drm_work_fence that adds kthread_use_mm() support for drivers that need to access userspace memory when a fence signals. Patch 3 converts XE to use drm_user_fence. XE continues to write a fence completion value to a userspace VA using the new helper. Patch 4 adds optional per-signal compare functionality to drm_user_fence. When cmp_addr is set, the worker is called only if the value at cmp_addr satisfies the configured comparison. This enables AMDGPU's EOP eventfd per-signal filtering without open-coding the read+compare pattern. A follow-on patch (not in this series) will wire AMDGPU's render-node EOP eventfd signaling path to drm_work_fence. v6: - Add WARN_ON_ONCE(!IS_ENABLED(CONFIG_64BIT)) in drm_user_fence_set_compare() since get_user() of u64 is not safe on 32-bit systems. Plain WARN_ON_ONCE() is used as drm_user_fence holds no struct drm_device * reference. (Thomas Hellström review) v5: - Split drm_user_fence into drm_work_fence (generic) and drm_user_fence (MM-borrowing subclass) per Matthew Brost's suggestion. - Add per-signal compare functionality (drm_user_fence_set_compare()) per Christian König's suggestion. - Use mmput_async() instead of mmput() to avoid potential deadlock in MMU notifier release path. (Sashiko review) - Use cmp_op != DRM_USER_FENCE_CMP_NONE as gate for compare logic. Add WARN_ON for invalid set_compare() arguments. (Sashiko review) Suggested-by: Matthew Brost <[email protected]> Suggested-by: Christian König <[email protected]> Cc: Thomas Hellström <[email protected]> Cc: Mika Kuoppala <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Srinivasan Shanmugam (4): drm: Add drm_work_fence helper drm: Add drm_user_fence helper drm/xe: Convert xe_user_fence to drm_user_fence drm: Add per-signal compare functionality to drm_user_fence drivers/gpu/drm/Makefile | 2 + drivers/gpu/drm/drm_user_fence.c | 149 ++++++++++++++++++++++ drivers/gpu/drm/drm_work_fence.c | 195 +++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_sync.c | 149 ++++++++++++---------- drivers/gpu/drm/xe/xe_sync.h | 2 + drivers/gpu/drm/xe/xe_sync_types.h | 1 - drivers/gpu/drm/xe/xe_vm.c | 1 + include/drm/drm_user_fence.h | 115 +++++++++++++++++ include/drm/drm_work_fence.h | 76 +++++++++++ 9 files changed, 621 insertions(+), 69 deletions(-) create mode 100644 drivers/gpu/drm/drm_user_fence.c create mode 100644 drivers/gpu/drm/drm_work_fence.c create mode 100644 include/drm/drm_user_fence.h create mode 100644 include/drm/drm_work_fence.h -- 2.34.1
