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

Reply via email to