[PATCH] dma-buf: use irq work for dma_fence_array_enable_signaling

Chunming Zhou zhoucm1 at amd.com
Fri Nov 9 14:25:15 UTC 2018


+Eric Anholt to aware this.


在 2018/11/9 22:21, Chunming Zhou 写道:
> Tested-And-Reviewed-by: Chunming Zhou <david1.zhou at amd.com>
>
>
> 在 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 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;
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel



More information about the dri-devel mailing list