[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