[PATCH] drm/amdgpu: wait for all rings to drain before runtime suspending

Alex Deucher alexdeucher at gmail.com
Wed Dec 11 14:47:45 UTC 2019


On Wed, Dec 11, 2019 at 8:07 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Am 11.12.19 um 03:26 schrieb zhoucm1:
> >
> > On 2019/12/11 上午6:08, Alex Deucher wrote:
> >> Add a safety check to runtime suspend to make sure all outstanding
> >> fences have signaled before we suspend.  Doesn't fix any known issue.
> >>
> >> We already do this via the fence driver suspend function, but we
> >> just force completion rather than bailing.  This bails on runtime
> >> suspend so we can try again later once the fences are signaled to
> >> avoid missing any outstanding work.
> >
> > The idea sounds OK to me, but if you want to drain the rings, you
> > should make sure no more submission, right?
> >
> > So you should park all schedulers before waiting for all outstanding
> > fences completed.
>
> At that point userspace should already be put to hold, so no new
> submissions. But it probably won't hurt stopping the scheduler anyway.
>

Any ioctl calls will wake the hw again or increase the usage count.

> But another issue I see is what happens if we locked up the hardware?
>

Regular GPU reset would kick in eventually.

Alex

> Christian.
>
> >
> > -David
> >
> >>
> >> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> >> ---
> >>   drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 12 +++++++++++-
> >>   1 file changed, 11 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >> index 2f367146c72c..81322b0a8acf 100644
> >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >> @@ -1214,13 +1214,23 @@ static int
> >> amdgpu_pmops_runtime_suspend(struct device *dev)
> >>       struct pci_dev *pdev = to_pci_dev(dev);
> >>       struct drm_device *drm_dev = pci_get_drvdata(pdev);
> >>       struct amdgpu_device *adev = drm_dev->dev_private;
> >> -    int ret;
> >> +    int ret, i;
> >>         if (!adev->runpm) {
> >>           pm_runtime_forbid(dev);
> >>           return -EBUSY;
> >>       }
> >>   +    /* wait for all rings to drain before suspending */
> >> +    for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
> >> +        struct amdgpu_ring *ring = adev->rings[i];
> >> +        if (ring && ring->sched.ready) {
> >> +            ret = amdgpu_fence_wait_empty(ring);
> >> +            if (ret)
> >> +                return -EBUSY;
> >> +        }
> >> +    }
> >> +
> >>       if (amdgpu_device_supports_boco(drm_dev))
> >>           drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
> >>       drm_kms_helper_poll_disable(drm_dev);
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>


More information about the amd-gfx mailing list