[RFC 08/12] dma-fence-chain: Propagate wait status to contained fences
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Tue Mar 7 10:48:20 UTC 2023
From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
As signaling is enabled on the container fence we need to propagate any
external waiting status to individual fences in order to enable owning
drivers see it.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
drivers/dma-buf/dma-fence-chain.c | 22 ++++++++++++++++------
include/linux/dma-fence-chain.h | 1 +
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/drivers/dma-buf/dma-fence-chain.c b/drivers/dma-buf/dma-fence-chain.c
index a0d920576ba6..ef6a5988c8aa 100644
--- a/drivers/dma-buf/dma-fence-chain.c
+++ b/drivers/dma-buf/dma-fence-chain.c
@@ -145,20 +145,30 @@ static void dma_fence_chain_cb(struct dma_fence *f, struct dma_fence_cb *cb)
static bool dma_fence_chain_enable_signaling(struct dma_fence *fence)
{
struct dma_fence_chain *head = to_dma_fence_chain(fence);
+ struct dma_fence *callback = NULL;
dma_fence_get(&head->base);
dma_fence_chain_for_each(fence, &head->base) {
struct dma_fence *f = dma_fence_chain_contained(fence);
- dma_fence_get(f);
- if (!dma_fence_add_callback(f, &head->cb, dma_fence_chain_cb)) {
+ if (!callback) {
+ dma_fence_get(f);
+ if (!dma_fence_add_callback(f, &head->cb,
+ dma_fence_chain_cb))
+ callback = f;
+ else
+ dma_fence_put(f);
+ } else if (head->base.waitcount && !head->waitcount) {
+ dma_fence_enable_sw_signaling(f);
+ } else {
dma_fence_put(fence);
- return true;
+ break;
}
- dma_fence_put(f);
}
- dma_fence_put(&head->base);
- return false;
+ head->waitcount = head->base.waitcount;
+ if (!callback)
+ dma_fence_put(&head->base);
+ return callback;
}
static bool dma_fence_chain_signaled(struct dma_fence *fence)
diff --git a/include/linux/dma-fence-chain.h b/include/linux/dma-fence-chain.h
index 4bdf0b96da28..349b882d31ea 100644
--- a/include/linux/dma-fence-chain.h
+++ b/include/linux/dma-fence-chain.h
@@ -25,6 +25,7 @@
struct dma_fence_chain {
struct dma_fence base;
struct dma_fence __rcu *prev;
+ bool waitcount;
u64 prev_seqno;
struct dma_fence *fence;
union {
--
2.37.2
More information about the dri-devel
mailing list