Lines Matching refs:ufence
35 struct xe_user_fence *ufence = container_of(kref, struct xe_user_fence, in user_fence_destroy() local
38 mmdrop(ufence->mm); in user_fence_destroy()
39 kfree(ufence); in user_fence_destroy()
42 static void user_fence_get(struct xe_user_fence *ufence) in user_fence_get() argument
44 kref_get(&ufence->refcount); in user_fence_get()
47 static void user_fence_put(struct xe_user_fence *ufence) in user_fence_put() argument
49 kref_put(&ufence->refcount, user_fence_destroy); in user_fence_put()
55 struct xe_user_fence *ufence; in user_fence_create() local
62 ufence = kzalloc(sizeof(*ufence), GFP_KERNEL); in user_fence_create()
63 if (!ufence) in user_fence_create()
66 ufence->xe = xe; in user_fence_create()
67 kref_init(&ufence->refcount); in user_fence_create()
68 ufence->addr = ptr; in user_fence_create()
69 ufence->value = value; in user_fence_create()
70 ufence->mm = current->mm; in user_fence_create()
71 mmgrab(ufence->mm); in user_fence_create()
73 return ufence; in user_fence_create()
78 struct xe_user_fence *ufence = container_of(w, struct xe_user_fence, worker); in user_fence_worker() local
80 if (mmget_not_zero(ufence->mm)) { in user_fence_worker()
81 kthread_use_mm(ufence->mm); in user_fence_worker()
82 if (copy_to_user(ufence->addr, &ufence->value, sizeof(ufence->value))) in user_fence_worker()
84 kthread_unuse_mm(ufence->mm); in user_fence_worker()
85 mmput(ufence->mm); in user_fence_worker()
87 drm_dbg(&ufence->xe->drm, "mmget_not_zero() failed, ufence wasn't signaled\n"); in user_fence_worker()
94 WRITE_ONCE(ufence->signalled, 1); in user_fence_worker()
95 wake_up_all(&ufence->xe->ufence_wq); in user_fence_worker()
96 user_fence_put(ufence); in user_fence_worker()
99 static void kick_ufence(struct xe_user_fence *ufence, struct dma_fence *fence) in kick_ufence() argument
101 INIT_WORK(&ufence->worker, user_fence_worker); in kick_ufence()
102 queue_work(ufence->xe->ordered_wq, &ufence->worker); in kick_ufence()
108 struct xe_user_fence *ufence = container_of(cb, struct xe_user_fence, cb); in user_fence_cb() local
110 kick_ufence(ufence, fence); in user_fence_cb()
195 sync->ufence = user_fence_create(xe, sync_in.addr, in xe_sync_entry_parse()
197 if (XE_IOCTL_DBG(xe, IS_ERR(sync->ufence))) in xe_sync_entry_parse()
198 return PTR_ERR(sync->ufence); in xe_sync_entry_parse()
239 } else if (sync->ufence) { in xe_sync_entry_signal()
243 user_fence_get(sync->ufence); in xe_sync_entry_signal()
244 err = dma_fence_add_callback(fence, &sync->ufence->cb, in xe_sync_entry_signal()
247 kick_ufence(sync->ufence, fence); in xe_sync_entry_signal()
250 user_fence_put(sync->ufence); in xe_sync_entry_signal()
262 if (sync->ufence) in xe_sync_entry_cleanup()
263 user_fence_put(sync->ufence); in xe_sync_entry_cleanup()
344 struct xe_user_fence *__xe_sync_ufence_get(struct xe_user_fence *ufence) in __xe_sync_ufence_get() argument
346 user_fence_get(ufence); in __xe_sync_ufence_get()
348 return ufence; in __xe_sync_ufence_get()
361 user_fence_get(sync->ufence); in xe_sync_ufence_get()
363 return sync->ufence; in xe_sync_ufence_get()
371 void xe_sync_ufence_put(struct xe_user_fence *ufence) in xe_sync_ufence_put() argument
373 user_fence_put(ufence); in xe_sync_ufence_put()
382 int xe_sync_ufence_get_status(struct xe_user_fence *ufence) in xe_sync_ufence_get_status() argument
384 return READ_ONCE(ufence->signalled); in xe_sync_ufence_get_status()