diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/dma-buf/dma-fence-array.c | 14 |
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 1a5f6a157a57..62b0de06836e 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig | |||
| @@ -244,6 +244,7 @@ config DMA_SHARED_BUFFER | |||
| 244 | bool | 244 | bool |
| 245 | default n | 245 | default n |
| 246 | select ANON_INODES | 246 | select ANON_INODES |
| 247 | select IRQ_WORK | ||
| 247 | help | 248 | help |
| 248 | This option enables the framework for buffer-sharing between | 249 | This option enables the framework for buffer-sharing between |
| 249 | multiple drivers. A buffer is associated with a file using driver | 250 | multiple drivers. A buffer is associated with a file using driver |
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); |
