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@xxxxxxxxxxxxx> Reviewed-by: Steven Price <steven.price@xxxxxxx> > --- > 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 >