In a recent discussion with Philip and Danilo the question came up what
was already tried and never finished to cleanup the dma_fence framework.

So here are the different ideas I came with but never fully finished,
with the patches itself modernized and rebased on top of drm-misc-next.

The main goal of those changes is to make it easier to implement dma_fence
backends and don't enforce unnecessary constrains on implementations.

As first step the locking around the dma_fence_ops.signaled callback is
made consistent by removing the dma_fence_is_signaled_locked() function.

This was mostly used by backends itself, but if polling the HW is desired
the backends can call their own functions for this directly without going
through the dma-fence layer.

XE actually seems to be the only driver which make use of that for a bit
more handling. For all other cases testing the signaled flag should be enough.

Then forcefully calling dma_fence_signaled() is removed from the dma-fence
layer and moved into the backend implementations.

This allows the backend implementations to cleanup after they have
signaled the fence. Such cleanup can include removing now signaled fences
from lists, dropping references, starting work etc....

Especially nouveau seems to have some really messy workaround because of
that involving the DMA_FENCE_FLAG_USER_BITS and installing callbacks
because the reference to the context couldn't be dropped directly after
signaling. This can now be cleaned up as far as I can see.

In the long term this should also allow reworking the error handling, e.g.
removing dma_fence_set_error() and instead giving the error as mandatory
parameter to dma_fence_signal().

Then the last piece is dropping calling enable_signaling callback with the
dma_fence lock held. This makes it possible for backends to acquire locks
which are semantically ordered outside of the dma_fence lock.

This is necessary to allows using the dma_fence inline lock in more cases,
previously backends used some common external lock for their dma_fences to
for example make it possible remove fences from linked lists.

Please comment and review,
Christian.

Reply via email to