[PATCH] drm/amdgpu: revert "take runtime pm reference when we attach a buffer"

Alex Deucher alexdeucher at gmail.com
Thu Jun 6 13:20:43 UTC 2024


On Thu, Jun 6, 2024 at 2:19 AM Christian König <christian.koenig at amd.com> wrote:
>
> Am 05.06.24 um 15:20 schrieb Alex Deucher:
>
> On Wed, Jun 5, 2024 at 8:32 AM Christian König
> <ckoenig.leichtzumerken at gmail.com> wrote:
>
> This reverts commit b8c415e3bf989be1b749409951debe6b36f5c78c and
> commit 425285d39afddaf4a9dab36045b816af0cc3e400.
>
> Taking a runtime pm reference for DMA-buf is actually completely
> unnecessary.
>
> When the buffer is in GTT it is still accessible even when the GPU
> is powered down and when it is in VRAM the buffer gets migrated to
> GTT before powering down.
>
> Won't that kind of defeat the purpose of P2P DMA?  I guess it's a
> trade off between performance and power savings.
>
>
> Not really. P2P is useful because ti avoids the extra bounce through system memory.
>
> But when the ASIC is powered down and not producing any new data there really is no extra bounce.
>
> The only use case which would make it mandatory to keep the runtime
> pm reference would be if we pin the buffer into VRAM, and that's not
> something we currently do.
>
> We'll need to bring this back if we ever support that?  I think we'll
> want that for P2P DMA with RDMA NICs that don't support ODP.  That's
> one of the big blockers for a lot of ROCm customers to migrate to the
> in box drivers.
>
>
> Yeah, but we need a completely different approach in that case.
>
> The problem is that calling pm_runtime_get_sync() from the DMA-buf callbacks is illegal in the first place because we have the reservation lock taken here which is also taken during resume.
>
> So this here never triggered or otherwise we would have seen a deadlock (I should probably mention that in the commit message).

Thanks.  With that added to the commit message, the patch is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

>
> Christian.
>
>
> Alex
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 33 ---------------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c   |  2 --
>  drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h   | 15 ----------
>  3 files changed, 50 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index 0b3b10d21952..ab848047204c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -41,8 +41,6 @@
>  #include <linux/dma-buf.h>
>  #include <linux/dma-fence-array.h>
>  #include <linux/pci-p2pdma.h>
> -#include <linux/pm_runtime.h>
> -#include "amdgpu_trace.h"
>
>  /**
>   * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation
> @@ -63,37 +61,7 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf,
>         if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0)
>                 attach->peer2peer = false;
>
> -       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
> -       trace_amdgpu_runpm_reference_dumps(1, __func__);
> -       if (r < 0)
> -               goto out;
> -
>         return 0;
> -
> -out:
> -       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> -       trace_amdgpu_runpm_reference_dumps(0, __func__);
> -       return r;
> -}
> -
> -/**
> - * amdgpu_dma_buf_detach - &dma_buf_ops.detach implementation
> - *
> - * @dmabuf: DMA-buf where we remove the attachment from
> - * @attach: the attachment to remove
> - *
> - * Called when an attachment is removed from the DMA-buf.
> - */
> -static void amdgpu_dma_buf_detach(struct dma_buf *dmabuf,
> -                                 struct dma_buf_attachment *attach)
> -{
> -       struct drm_gem_object *obj = dmabuf->priv;
> -       struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
> -       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> -
> -       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
> -       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> -       trace_amdgpu_runpm_reference_dumps(0, __func__);
>  }
>
>  /**
> @@ -266,7 +234,6 @@ static int amdgpu_dma_buf_begin_cpu_access(struct dma_buf *dma_buf,
>
>  const struct dma_buf_ops amdgpu_dmabuf_ops = {
>         .attach = amdgpu_dma_buf_attach,
> -       .detach = amdgpu_dma_buf_detach,
>         .pin = amdgpu_dma_buf_pin,
>         .unpin = amdgpu_dma_buf_unpin,
>         .map_dma_buf = amdgpu_dma_buf_map,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> index 10832b470448..bc3ac73b6b8d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> @@ -181,7 +181,6 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amd
>         amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
>                                seq, flags | AMDGPU_FENCE_FLAG_INT);
>         pm_runtime_get_noresume(adev_to_drm(adev)->dev);
> -       trace_amdgpu_runpm_reference_dumps(1, __func__);
>         ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
>         if (unlikely(rcu_dereference_protected(*ptr, 1))) {
>                 struct dma_fence *old;
> @@ -309,7 +308,6 @@ bool amdgpu_fence_process(struct amdgpu_ring *ring)
>                 dma_fence_put(fence);
>                 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
>                 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> -               trace_amdgpu_runpm_reference_dumps(0, __func__);
>         } while (last_seq != seq);
>
>         return true;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> index f539b1d00234..2fd1bfb35916 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> @@ -554,21 +554,6 @@ TRACE_EVENT(amdgpu_reset_reg_dumps,
>                       __entry->value)
>  );
>
> -TRACE_EVENT(amdgpu_runpm_reference_dumps,
> -           TP_PROTO(uint32_t index, const char *func),
> -           TP_ARGS(index, func),
> -           TP_STRUCT__entry(
> -                            __field(uint32_t, index)
> -                            __string(func, func)
> -                            ),
> -           TP_fast_assign(
> -                          __entry->index = index;
> -                          __assign_str(func, func);
> -                          ),
> -           TP_printk("amdgpu runpm reference dump 0x%x: 0x%s\n",
> -                     __entry->index,
> -                     __get_str(func))
> -);
>  #undef AMDGPU_JOB_GET_TIMELINE_NAME
>  #endif
>
> --
> 2.34.1
>
>


More information about the amd-gfx mailing list