[PATCH] dma-buf: use irq work for dma_fence_array_enable_signaling
Christian König
ckoenig.leichtzumerken at gmail.com
Fri Nov 9 12:20:25 UTC 2018
Also use the irq work for dma_fence_array_enable_signaling to make sure
that the spinlock for the dma-fence-array is always unrelated to all
other spinlocks.
This fixes a lockdep warning if a dma-fence-array is embedded into
another dma-fence-array.
Signed-off-by: Christian König <christian.koenig at amd.com>
---
drivers/dma-buf/dma-fence-array.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c
index a8c254497251..3adf6b04f5fd 100644
--- a/drivers/dma-buf/dma-fence-array.c
+++ b/drivers/dma-buf/dma-fence-array.c
@@ -31,7 +31,7 @@ static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence)
return "unbound";
}
-static void irq_dma_fence_array_work(struct irq_work *wrk)
+static void dma_fence_array_cb_work(struct irq_work *wrk)
{
struct dma_fence_array *array = container_of(wrk, typeof(*array), work);
@@ -52,12 +52,13 @@ static void dma_fence_array_cb_func(struct dma_fence *f,
dma_fence_put(&array->base);
}
-static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
+static void dma_fence_array_enable_signaling_work(struct irq_work *wrk)
{
- struct dma_fence_array *array = to_dma_fence_array(fence);
+ struct dma_fence_array *array = container_of(wrk, typeof(*array), work);
struct dma_fence_array_cb *cb = (void *)(&array[1]);
unsigned i;
+ init_irq_work(&array->work, dma_fence_array_cb_work);
for (i = 0; i < array->num_fences; ++i) {
cb[i].array = array;
/*
@@ -71,12 +72,19 @@ static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
dma_fence_get(&array->base);
if (dma_fence_add_callback(array->fences[i], &cb[i].cb,
dma_fence_array_cb_func)) {
- dma_fence_put(&array->base);
if (atomic_dec_and_test(&array->num_pending))
- return false;
+ dma_fence_signal(&array->base);
+ dma_fence_put(&array->base);
}
}
+}
+static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
+{
+ struct dma_fence_array *array = to_dma_fence_array(fence);
+
+ init_irq_work(&array->work, dma_fence_array_enable_signaling_work);
+ irq_work_queue(&array->work);
return true;
}
@@ -144,8 +152,6 @@ struct dma_fence_array *dma_fence_array_create(int num_fences,
spin_lock_init(&array->lock);
dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
context, seqno);
- init_irq_work(&array->work, irq_dma_fence_array_work);
-
array->num_fences = num_fences;
atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
array->fences = fences;
--
2.14.1
More information about the dri-devel
mailing list