[PATCH v2 3/7] drm/panfrost: Add BO access flags to relax dependencies between jobs

Steven Price steven.price at arm.com
Fri Jul 2 09:45:19 UTC 2021


On 01/07/2021 10:12, Boris Brezillon wrote:
> Jobs reading from the same BO should not be serialized. Add access
> flags so we can relax the implicit dependencies in that case. We force
> exclusive access for now to keep the behavior unchanged, but a new
> SUBMIT ioctl taking explicit access flags will be introduced.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>

Reviewed-by: Steven Price <steven.price at arm.com>

> ---
>  drivers/gpu/drm/panfrost/panfrost_drv.c |  9 +++++++++
>  drivers/gpu/drm/panfrost/panfrost_job.c | 23 +++++++++++++++++++----
>  drivers/gpu/drm/panfrost/panfrost_job.h |  1 +
>  include/uapi/drm/panfrost_drm.h         |  2 ++
>  4 files changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index 9bbc9e78cc85..b6b5997c9366 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -164,6 +164,15 @@ panfrost_lookup_bos(struct drm_device *dev,
>  	if (!job->bo_count)
>  		return 0;
>  
> +	job->bo_flags = kvmalloc_array(job->bo_count,
> +				       sizeof(*job->bo_flags),
> +				       GFP_KERNEL | __GFP_ZERO);
> +	if (!job->bo_flags)
> +		return -ENOMEM;
> +
> +	for (i = 0; i < job->bo_count; i++)
> +		job->bo_flags[i] = PANFROST_BO_REF_EXCLUSIVE;
> +
>  	ret = drm_gem_objects_lookup(file_priv,
>  				     (void __user *)(uintptr_t)args->bo_handles,
>  				     job->bo_count, &job->bos);
> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
> index fdc1bd7ecf12..152245b122be 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_job.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_job.c
> @@ -245,8 +245,16 @@ static int panfrost_acquire_object_fences(struct panfrost_job *job)
>  	int i, ret;
>  
>  	for (i = 0; i < job->bo_count; i++) {
> -		/* panfrost always uses write mode in its current uapi */
> -		ret = drm_gem_fence_array_add_implicit(&job->deps, job->bos[i], true);
> +		bool exclusive = job->bo_flags[i] & PANFROST_BO_REF_EXCLUSIVE;
> +
> +		if (!exclusive) {
> +			ret = dma_resv_reserve_shared(job->bos[i]->resv, 1);
> +			if (ret)
> +				return ret;
> +		}
> +
> +		ret = drm_gem_fence_array_add_implicit(&job->deps, job->bos[i],
> +						       exclusive);
>  		if (ret)
>  			return ret;
>  	}
> @@ -258,8 +266,14 @@ static void panfrost_attach_object_fences(struct panfrost_job *job)
>  {
>  	int i;
>  
> -	for (i = 0; i < job->bo_count; i++)
> -		dma_resv_add_excl_fence(job->bos[i]->resv, job->render_done_fence);
> +	for (i = 0; i < job->bo_count; i++) {
> +		struct dma_resv *robj = job->bos[i]->resv;
> +
> +		if (job->bo_flags[i] & PANFROST_BO_REF_EXCLUSIVE)
> +			dma_resv_add_excl_fence(robj, job->render_done_fence);
> +		else
> +			dma_resv_add_shared_fence(robj, job->render_done_fence);
> +	}
>  }
>  
>  int panfrost_job_push(struct panfrost_job *job)
> @@ -340,6 +354,7 @@ static void panfrost_job_cleanup(struct kref *ref)
>  		kvfree(job->bos);
>  	}
>  
> +	kvfree(job->bo_flags);
>  	kfree(job);
>  }
>  
> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.h b/drivers/gpu/drm/panfrost/panfrost_job.h
> index 82306a03b57e..1cbc3621b663 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_job.h
> +++ b/drivers/gpu/drm/panfrost/panfrost_job.h
> @@ -32,6 +32,7 @@ struct panfrost_job {
>  
>  	struct panfrost_gem_mapping **mappings;
>  	struct drm_gem_object **bos;
> +	u32 *bo_flags;
>  	u32 bo_count;
>  
>  	/* Fence to be signaled by drm-sched once its done with the job */
> diff --git a/include/uapi/drm/panfrost_drm.h b/include/uapi/drm/panfrost_drm.h
> index 061e700dd06c..45d6c600475c 100644
> --- a/include/uapi/drm/panfrost_drm.h
> +++ b/include/uapi/drm/panfrost_drm.h
> @@ -224,6 +224,8 @@ struct drm_panfrost_madvise {
>  	__u32 retained;       /* out, whether backing store still exists */
>  };
>  
> +#define PANFROST_BO_REF_EXCLUSIVE	0x1
> +
>  #if defined(__cplusplus)
>  }
>  #endif
> 



More information about the dri-devel mailing list