[PATCH 2/3] drm/amdgpu/pm_runtime: update usage count in fence handling

Alex Deucher alexdeucher at gmail.com
Mon Dec 16 20:22:16 UTC 2019


On Mon, Dec 16, 2019 at 3:19 PM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Am 16.12.19 um 18:18 schrieb Alex Deucher:
> > Increment the usage count in emit fence, and decrement in
> > process fence to make sure the GPU is always considered in
> > use while there are fences outstanding.  We always wait for
> > the engines to drain in runtime suspend, but in practice
> > that only covers short lived jobs for gfx.  This should
> > cover us for longer lived fences.
> >
> > Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> > ---
> >   drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 6 +++++-
> >   1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> > index 377fe20bce23..e9efee04ca23 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> > @@ -34,6 +34,7 @@
> >   #include <linux/kref.h>
> >   #include <linux/slab.h>
> >   #include <linux/firmware.h>
> > +#include <linux/pm_runtime.h>
> >
> >   #include <drm/drm_debugfs.h>
> >
> > @@ -154,7 +155,7 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f,
> >                      seq);
> >       amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
> >                              seq, flags | AMDGPU_FENCE_FLAG_INT);
> > -
> > +     pm_runtime_get_noresume(adev->ddev->dev);
> >       ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
> >       if (unlikely(rcu_dereference_protected(*ptr, 1))) {
> >               struct dma_fence *old;
> > @@ -234,6 +235,7 @@ static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring)
> >   bool amdgpu_fence_process(struct amdgpu_ring *ring)
> >   {
> >       struct amdgpu_fence_driver *drv = &ring->fence_drv;
> > +     struct amdgpu_device *adev = ring->adev;
> >       uint32_t seq, last_seq;
> >       int r;
> >
> > @@ -274,6 +276,8 @@ bool amdgpu_fence_process(struct amdgpu_ring *ring)
> >                       BUG();
> >
> >               dma_fence_put(fence);
> > +             pm_runtime_mark_last_busy(adev->ddev->dev);
> > +             pm_runtime_put_autosuspend(adev->ddev->dev);
>
> Are you sure this is ok? Keep in mind that this function is called in
> interrupt context.

According to:
https://www.kernel.org/doc/Documentation/power/runtime_pm.txt
it's ok to call those in an interrupt context.

Alex

>
> Christian.
>
> >       } while (last_seq != seq);
> >
> >       return true;
>


More information about the amd-gfx mailing list