Messages in this thread | | | Date | Wed, 15 Jun 2022 13:03:24 -0500 | Subject | Re: [PATCH 2/2] drm/msm: Don't overwrite hw fence in hw_init | From | Steev Klimaszewski <> |
| |
On 6/15/22 10:01 AM, Rob Clark wrote: > From: Rob Clark <robdclark@chromium.org> > > Prior to the last commit, this could result in setting the GPU > written fence value back to an older value, if we had missed > updating completed_fence prior to suspend. This was mostly > harmless as the GPU would eventually overwrite it again with > the correct value. But we should just not do this. Instead > just leave a sanity check that the fence looks plausible (in > case the GPU scribbled on memory). > > Reported-by: Steev Klimaszewski <steev@kali.org> > Fixes: 95d1deb02a9c ("drm/msm/gem: Add fenced vma unpin") > Signed-off-by: Rob Clark <robdclark@chromium.org> > --- > drivers/gpu/drm/msm/adreno/adreno_gpu.c | 11 ++++++++--- > drivers/gpu/drm/msm/msm_gpu.c | 2 +- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c > index e1aef4875e2f..dd044d557c7c 100644 > --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c > @@ -498,10 +498,15 @@ int adreno_hw_init(struct msm_gpu *gpu) > > ring->cur = ring->start; > ring->next = ring->start; > - > - /* reset completed fence seqno: */ > - ring->memptrs->fence = ring->fctx->completed_fence; > ring->memptrs->rptr = 0; > + > + /* Detect and clean up an impossible fence, ie. if GPU managed > + * to scribble something invalid, we don't want that to confuse > + * us into mistakingly believing that submits have completed. > + */ > + if (fence_before(ring->fctx->last_fence, ring->memptrs->fence)) { > + ring->memptrs->fence = ring->fctx->last_fence; > + } > } > > return 0; > diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c > index b61078f0cd0f..8c00f9187c03 100644 > --- a/drivers/gpu/drm/msm/msm_gpu.c > +++ b/drivers/gpu/drm/msm/msm_gpu.c > @@ -430,7 +430,7 @@ static void recover_worker(struct kthread_work *work) > * one more to clear the faulting submit > */ > if (ring == cur_ring) > - fence++; > + ring->memptrs->fence = ++fence; > > msm_update_fence(ring->fctx, fence); > }
Tested on the Lenovo Yoga C630
Tested-by: Steev Klimaszewski <steev@kali.org>
| |