forked from mirrors/linux
		
	drm/msm: Pre-allocate hw_fence
Avoid allocating memory in job_run() by pre-allocating the hw_fence. Signed-off-by: Rob Clark <robdclark@chromium.org> Patchwork: https://patchwork.freedesktop.org/patch/527832/ Link: https://lore.kernel.org/r/20230320144356.803762-2-robdclark@gmail.com
This commit is contained in:
		
							parent
							
								
									24a9671942
								
							
						
					
					
						commit
						f94e6a51e1
					
				
					 4 changed files with 20 additions and 5 deletions
				
			
		|  | @ -99,7 +99,7 @@ static const struct dma_fence_ops msm_fence_ops = { | |||
| }; | ||||
| 
 | ||||
| struct dma_fence * | ||||
| msm_fence_alloc(struct msm_fence_context *fctx) | ||||
| msm_fence_alloc(void) | ||||
| { | ||||
| 	struct msm_fence *f; | ||||
| 
 | ||||
|  | @ -107,10 +107,16 @@ msm_fence_alloc(struct msm_fence_context *fctx) | |||
| 	if (!f) | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
| 
 | ||||
| 	return &f->base; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx) | ||||
| { | ||||
| 	struct msm_fence *f = to_msm_fence(fence); | ||||
| 
 | ||||
| 	f->fctx = fctx; | ||||
| 
 | ||||
| 	dma_fence_init(&f->base, &msm_fence_ops, &fctx->spinlock, | ||||
| 		       fctx->context, ++fctx->last_fence); | ||||
| 
 | ||||
| 	return &f->base; | ||||
| } | ||||
|  |  | |||
|  | @ -61,7 +61,8 @@ void msm_fence_context_free(struct msm_fence_context *fctx); | |||
| bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence); | ||||
| void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence); | ||||
| 
 | ||||
| struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx); | ||||
| struct dma_fence * msm_fence_alloc(void); | ||||
| void msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx); | ||||
| 
 | ||||
| static inline bool | ||||
| fence_before(uint32_t a, uint32_t b) | ||||
|  |  | |||
|  | @ -41,8 +41,16 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, | |||
| 	if (!submit) | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
| 
 | ||||
| 	submit->hw_fence = msm_fence_alloc(); | ||||
| 	if (IS_ERR(submit->hw_fence)) { | ||||
| 		ret = PTR_ERR(submit->hw_fence); | ||||
| 		kfree(submit); | ||||
| 		return ERR_PTR(ret); | ||||
| 	} | ||||
| 
 | ||||
| 	ret = drm_sched_job_init(&submit->base, queue->entity, queue); | ||||
| 	if (ret) { | ||||
| 		kfree(submit->hw_fence); | ||||
| 		kfree(submit); | ||||
| 		return ERR_PTR(ret); | ||||
| 	} | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job) | |||
| 	struct msm_gpu *gpu = submit->gpu; | ||||
| 	int i; | ||||
| 
 | ||||
| 	submit->hw_fence = msm_fence_alloc(fctx); | ||||
| 	msm_fence_init(submit->hw_fence, fctx); | ||||
| 
 | ||||
| 	for (i = 0; i < submit->nr_bos; i++) { | ||||
| 		struct drm_gem_object *obj = &submit->bos[i].obj->base; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Rob Clark
						Rob Clark