Re: [PATCH] drm/amdgpu: set completion status as preempted for the resubmission

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 26, 2023 at 4:24 AM <jiadong.zhu@xxxxxxx> wrote:
>
> From: Jiadong Zhu <Jiadong.Zhu@xxxxxxx>
>
> The driver's CSA buffer is shared by all the ibs. When the high priority ib
> is submitted after the preempted ib, CP overrides the ib_completion_status
> as completed in the csa buffer. After that the preempted ib is resubmitted,
> CP would clear some locals stored for ib resume when reading the completed
> status, which causes gpu hang in some cases.
>
> Always set status as preempted for those resubmitted ib instead of reading
> everything from the CSA buffer.
>
> Signed-off-by: Jiadong Zhu <Jiadong.Zhu@xxxxxxx>

Acked-by: Alex Deucher <alexander.deucher@xxxxxxx>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h | 9 +++++++++
>  drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c        | 4 +++-
>  2 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h
> index b22d4fb2a847..d3186b570b82 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h
> @@ -56,6 +56,15 @@ enum amdgpu_ring_mux_offset_type {
>         AMDGPU_MUX_OFFSET_TYPE_CE,
>  };
>
> +enum ib_complete_status {
> +       /* IB not started/reset value, default value. */
> +       IB_COMPLETION_STATUS_DEFAULT = 0,
> +       /* IB preempted, started but not completed. */
> +       IB_COMPLETION_STATUS_PREEMPTED = 1,
> +       /* IB completed. */
> +       IB_COMPLETION_STATUS_COMPLETED = 2,
> +};
> +
>  struct amdgpu_ring_mux {
>         struct amdgpu_ring      *real_ring;
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index fc179e5f8dc1..272f206042bf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -5169,7 +5169,6 @@ static void gfx_v9_0_ring_patch_cntl(struct amdgpu_ring *ring,
>                                      unsigned offset)
>  {
>         u32 control = ring->ring[offset];
> -
>         control |= INDIRECT_BUFFER_PRE_RESUME(1);
>         ring->ring[offset] = control;
>  }
> @@ -5226,6 +5225,9 @@ static void gfx_v9_0_ring_patch_de_meta(struct amdgpu_ring *ring,
>                 de_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset;
>         }
>
> +       ((struct v9_de_ib_state *)de_payload_cpu_addr)->ib_completion_status =
> +               IB_COMPLETION_STATUS_PREEMPTED;
> +
>         if (offset + (payload_size >> 2) <= ring->buf_mask + 1) {
>                 memcpy((void *)&ring->ring[offset], de_payload_cpu_addr, payload_size);
>         } else {
> --
> 2.25.1
>




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux