diff options
Diffstat (limited to 'drivers/gpu/drm/imagination/pvr_queue.c')
| -rw-r--r-- | drivers/gpu/drm/imagination/pvr_queue.c | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/imagination/pvr_queue.c b/drivers/gpu/drm/imagination/pvr_queue.c index c4f08432882b..43411be930a2 100644 --- a/drivers/gpu/drm/imagination/pvr_queue.c +++ b/drivers/gpu/drm/imagination/pvr_queue.c @@ -109,12 +109,20 @@ pvr_queue_fence_get_driver_name(struct dma_fence *f)  	return PVR_DRIVER_NAME;  } +static void pvr_queue_fence_release_work(struct work_struct *w) +{ +	struct pvr_queue_fence *fence = container_of(w, struct pvr_queue_fence, release_work); + +	pvr_context_put(fence->queue->ctx); +	dma_fence_free(&fence->base); +} +  static void pvr_queue_fence_release(struct dma_fence *f)  {  	struct pvr_queue_fence *fence = container_of(f, struct pvr_queue_fence, base); +	struct pvr_device *pvr_dev = fence->queue->ctx->pvr_dev; -	pvr_context_put(fence->queue->ctx); -	dma_fence_free(f); +	queue_work(pvr_dev->sched_wq, &fence->release_work);  }  static const char * @@ -268,6 +276,7 @@ pvr_queue_fence_init(struct dma_fence *f,  	pvr_context_get(queue->ctx);  	fence->queue = queue; +	INIT_WORK(&fence->release_work, pvr_queue_fence_release_work);  	dma_fence_init(&fence->base, fence_ops,  		       &fence_ctx->lock, fence_ctx->id,  		       atomic_inc_return(&fence_ctx->seqno)); @@ -304,8 +313,9 @@ pvr_queue_cccb_fence_init(struct dma_fence *fence, struct pvr_queue *queue)  static void  pvr_queue_job_fence_init(struct dma_fence *fence, struct pvr_queue *queue)  { -	pvr_queue_fence_init(fence, queue, &pvr_queue_job_fence_ops, -			     &queue->job_fence_ctx); +	if (!fence->ops) +		pvr_queue_fence_init(fence, queue, &pvr_queue_job_fence_ops, +				     &queue->job_fence_ctx);  }  /** | 
