KFD can call amdgpu_eventfd_notify(pasid,event_id,count) with only the PASID and event_id. amdgpu looks up all render-node fprivs for that PASID and signals any eventfd bound to that event_id.
This is IRQ-safe: notify iterates the PASID registry under RCU, and the per-fpriv eventfd lookup/signaling is already IRQ-safe. Cc: Harish Kasiviswanathan <[email protected]> Cc: Felix Kuehling <[email protected]> Cc: Alex Deucher <[email protected]> Cc: Christian König <[email protected]> Signed-off-by: Srinivasan Shanmugam <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +- .../gpu/drm/amd/amdgpu/amdgpu_eventfd_pasid.c | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 4faf908d5af5..7ab03624b301 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -480,7 +480,7 @@ int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv); /* Global PASID->fpriv registry for KFD->render eventfd bridge */ void amdgpu_eventfd_pasid_register(struct amdgpu_fpriv *fpriv, u32 pasid); void amdgpu_eventfd_pasid_unregister(struct amdgpu_fpriv *fpriv, u32 pasid); - +void amdgpu_eventfd_notify(u32 pasid, u32 event_id, u64 count); /* * Writeback */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eventfd_pasid.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_eventfd_pasid.c index 770ccc0be70b..5340ce9b2869 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eventfd_pasid.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eventfd_pasid.c @@ -112,3 +112,30 @@ void amdgpu_eventfd_pasid_unregister(struct amdgpu_fpriv *fpriv, u32 pasid) spin_unlock(&amdgpu_pasid_ht_lock); } EXPORT_SYMBOL_GPL(amdgpu_eventfd_pasid_unregister); + +void amdgpu_eventfd_notify(u32 pasid, u32 event_id, u64 count) +{ + struct amdgpu_pasid_fpriv_node *n; + + if (!pasid || !event_id) + return; + + if (!count) + count = 1; + + rcu_read_lock(); + hash_for_each_possible_rcu(amdgpu_pasid_ht, n, hnode, pasid) { + struct amdgpu_fpriv *fpriv = READ_ONCE(n->fpriv); + + if (!fpriv) + continue; + + /* If render fd is closing, avoid signaling torn-down registry */ + if (READ_ONCE(fpriv->evf_mgr.fd_closing)) + continue; + + amdgpu_eventfd_signal(fpriv, event_id, count); + } + rcu_read_unlock(); +} +EXPORT_SYMBOL_GPL(amdgpu_eventfd_notify); -- 2.34.1
