diff options
Diffstat (limited to 'drivers/dma-buf/dma-fence-array.c')
-rw-r--r-- | drivers/dma-buf/dma-fence-array.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index 0350829ba62e..dd1edfb27b61 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c | |||
@@ -31,6 +31,14 @@ static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence) | |||
31 | return "unbound"; | 31 | return "unbound"; |
32 | } | 32 | } |
33 | 33 | ||
34 | static void irq_dma_fence_array_work(struct irq_work *wrk) | ||
35 | { | ||
36 | struct dma_fence_array *array = container_of(wrk, typeof(*array), work); | ||
37 | |||
38 | dma_fence_signal(&array->base); | ||
39 | dma_fence_put(&array->base); | ||
40 | } | ||
41 | |||
34 | static void dma_fence_array_cb_func(struct dma_fence *f, | 42 | static void dma_fence_array_cb_func(struct dma_fence *f, |
35 | struct dma_fence_cb *cb) | 43 | struct dma_fence_cb *cb) |
36 | { | 44 | { |
@@ -39,8 +47,9 @@ static void dma_fence_array_cb_func(struct dma_fence *f, | |||
39 | struct dma_fence_array *array = array_cb->array; | 47 | struct dma_fence_array *array = array_cb->array; |
40 | 48 | ||
41 | if (atomic_dec_and_test(&array->num_pending)) | 49 | if (atomic_dec_and_test(&array->num_pending)) |
42 | dma_fence_signal(&array->base); | 50 | irq_work_queue(&array->work); |
43 | dma_fence_put(&array->base); | 51 | else |
52 | dma_fence_put(&array->base); | ||
44 | } | 53 | } |
45 | 54 | ||
46 | static bool dma_fence_array_enable_signaling(struct dma_fence *fence) | 55 | static bool dma_fence_array_enable_signaling(struct dma_fence *fence) |
@@ -136,6 +145,7 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, | |||
136 | spin_lock_init(&array->lock); | 145 | spin_lock_init(&array->lock); |
137 | dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock, | 146 | dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock, |
138 | context, seqno); | 147 | context, seqno); |
148 | init_irq_work(&array->work, irq_dma_fence_array_work); | ||
139 | 149 | ||
140 | array->num_fences = num_fences; | 150 | array->num_fences = num_fences; |
141 | atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences); | 151 | atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences); |