WRITE_ONCE(ufence->signalled, 1); if (mmget_not_zero(ufence->mm)) {
kthread_use_mm(ufence->mm); if (copy_to_user(ufence->addr, &ufence->value, sizeof(ufence->value)))
XE_WARN_ON("Copy to user failed");
kthread_unuse_mm(ufence->mm);
mmput(ufence->mm);
} else {
drm_dbg(&ufence->xe->drm, "mmget_not_zero() failed, ufence wasn't signaled\n");
}
/* * Wake up waiters only after updating the ufence state, allowing the UMD * to safely reuse the same ufence without encountering -EBUSY errors.
*/
wake_up_all(&ufence->xe->ufence_wq);
user_fence_put(ufence);
}
if (sync->chain_fence) {
drm_syncobj_add_point(sync->syncobj, sync->chain_fence,
fence, sync->timeline_value); /* * The chain's ownership is transferred to the * timeline.
*/
sync->chain_fence = NULL;
} elseif (sync->syncobj) {
drm_syncobj_replace_fence(sync->syncobj, fence);
} elseif (sync->ufence) { int err;
dma_fence_get(fence);
user_fence_get(sync->ufence);
err = dma_fence_add_callback(fence, &sync->ufence->cb,
user_fence_cb); if (err == -ENOENT) {
kick_ufence(sync->ufence, fence);
} elseif (err) {
XE_WARN_ON("failed to add user fence");
user_fence_put(sync->ufence);
dma_fence_put(fence);
}
}
}
void xe_sync_entry_cleanup(struct xe_sync_entry *sync)
{ if (sync->syncobj)
drm_syncobj_put(sync->syncobj);
dma_fence_put(sync->fence);
dma_fence_chain_free(sync->chain_fence); if (sync->ufence)
user_fence_put(sync->ufence);
}
/** * xe_sync_in_fence_get() - Get a fence from syncs, exec queue, and VM * @sync: input syncs * @num_sync: number of syncs * @q: exec queue * @vm: VM * * Get a fence from syncs, exec queue, and VM. If syncs contain in-fences create * and return a composite fence of all in-fences + last fence. If no in-fences * return last fence on input exec queue. Caller must drop reference to * returned fence. * * Return: fence on success, ERR_PTR(-ENOMEM) on failure
*/ struct dma_fence *
xe_sync_in_fence_get(struct xe_sync_entry *sync, int num_sync, struct xe_exec_queue *q, struct xe_vm *vm)
{ struct dma_fence **fences = NULL; struct dma_fence_array *cf = NULL; struct dma_fence *fence; int i, num_in_fence = 0, current_fence = 0;
lockdep_assert_held(&vm->lock);
/* Count in-fences */ for (i = 0; i < num_sync; ++i) { if (sync[i].fence) {
++num_in_fence;
fence = sync[i].fence;
}
}
/* Create composite fence */
fences = kmalloc_array(num_in_fence + 1, sizeof(*fences), GFP_KERNEL); if (!fences) return ERR_PTR(-ENOMEM); for (i = 0; i < num_sync; ++i) { if (sync[i].fence) {
dma_fence_get(sync[i].fence);
fences[current_fence++] = sync[i].fence;
}
}
fences[current_fence++] = xe_exec_queue_last_fence_get(q, vm);
cf = dma_fence_array_create(num_in_fence, fences,
vm->composite_fence_ctx,
vm->composite_fence_seqno++, false); if (!cf) {
--vm->composite_fence_seqno; goto err_out;
}
return &cf->base;
err_out: while (current_fence)
dma_fence_put(fences[--current_fence]);
kfree(fences);
kfree(cf);
return ERR_PTR(-ENOMEM);
}
/** * __xe_sync_ufence_get() - Get user fence from user fence * @ufence: input user fence * * Get a user fence reference from user fence * * Return: xe_user_fence pointer with reference
*/ struct xe_user_fence *__xe_sync_ufence_get(struct xe_user_fence *ufence)
{
user_fence_get(ufence);
return ufence;
}
/** * xe_sync_ufence_get() - Get user fence from sync * @sync: input sync * * Get a user fence reference from sync. * * Return: xe_user_fence pointer with reference
*/ struct xe_user_fence *xe_sync_ufence_get(struct xe_sync_entry *sync)
{
user_fence_get(sync->ufence);
return sync->ufence;
}
/** * xe_sync_ufence_put() - Put user fence reference * @ufence: user fence reference *
*/ void xe_sync_ufence_put(struct xe_user_fence *ufence)
{
user_fence_put(ufence);
}
/** * xe_sync_ufence_get_status() - Get user fence status * @ufence: user fence * * Return: 1 if signalled, 0 not signalled, <0 on error
*/ int xe_sync_ufence_get_status(struct xe_user_fence *ufence)
{ return READ_ONCE(ufence->signalled);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.