+Eric Anholt to aware this. 在 2018/11/9 22:21, Chunming Zhou 写道: > Tested-And-Reviewed-by: Chunming Zhou <david1.zhou@xxxxxxx> > > > 在 2018/11/9 20:20, Christian König 写道: >> 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@xxxxxxx> >> --- >> 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; > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel