[PATCH 19/24] drm/amdkfd: enable pc sampling stop

Yat Sin, David David.YatSin at amd.com
Fri Nov 10 19:07:03 UTC 2023


[AMD Official Use Only - General]

> -----Original Message-----
> From: Zhu, James <James.Zhu at amd.com>
> Sent: Friday, November 3, 2023 9:12 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Kuehling, Felix <Felix.Kuehling at amd.com>; Greathouse, Joseph
> <Joseph.Greathouse at amd.com>; Yat Sin, David <David.YatSin at amd.com>; Zhu,
> James <James.Zhu at amd.com>
> Subject: [PATCH 19/24] drm/amdkfd: enable pc sampling stop
>
> Enable pc sampling stop.
>
> Signed-off-by: James Zhu <James.Zhu at amd.com>
> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c | 28 +++++++++++++++++--
> -
>  drivers/gpu/drm/amd/amdkfd/kfd_priv.h        |  2 ++
>  2 files changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
> index 33d003ca0093..2c4ac5b4cc4b 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
> @@ -108,10 +108,32 @@ static int kfd_pc_sample_start(struct
> kfd_process_device *pdd,
>       return 0;
>  }
>
> -static int kfd_pc_sample_stop(struct kfd_process_device *pdd)
> +static int kfd_pc_sample_stop(struct kfd_process_device *pdd,
> +                                     struct pc_sampling_entry *pcs_entry)
>  {
> -     return -EINVAL;
> +     bool pc_sampling_stop = false;
> +
> +     pcs_entry->enabled = false;
> +     mutex_lock(&pdd->dev->pcs_data.mutex);
For the START/STOP/DESTROY ioctls, I think we can hold pdd->dev->pcs_data.mutex through the whole IOCTL. Then we would not have to deal with the intermediate states where the START/STOP/DESTROY are happening at the same time.

> +     pdd->dev->pcs_data.hosttrap_entry.base.active_count--;
> +     if (!pdd->dev->pcs_data.hosttrap_entry.base.active_count) {
> +             WRITE_ONCE(pdd->dev-
> >pcs_data.hosttrap_entry.base.stop_enable, true);
> +             pc_sampling_stop = true;
> +     }
> +     mutex_unlock(&pdd->dev->pcs_data.mutex);
>
> +     if (pc_sampling_stop) {
> +             kfd_process_set_trap_pc_sampling_flag(&pdd->qpd,
> +                     pdd->dev-
> >pcs_data.hosttrap_entry.base.pc_sample_info.method,
> +false);
> +
> +             mutex_lock(&pdd->dev->pcs_data.mutex);
> +             pdd->dev->pcs_data.hosttrap_entry.base.target_simd = 0;
> +             pdd->dev->pcs_data.hosttrap_entry.base.target_wave_slot = 0;
> +             WRITE_ONCE(pdd->dev-
> >pcs_data.hosttrap_entry.base.stop_enable, false);
> +             mutex_unlock(&pdd->dev->pcs_data.mutex);
> +     }
> +
> +     return 0;
>  }
>
>  static int kfd_pc_sample_create(struct kfd_process_device *pdd, @@ -251,7
> +273,7 @@ int kfd_pc_sample(struct kfd_process_device *pdd,
>               if (!pcs_entry->enabled)
>                       return -EALREADY;
>               else
> -                     return kfd_pc_sample_stop(pdd);
> +                     return kfd_pc_sample_stop(pdd, pcs_entry);
>       }
>
>       return -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> index 613910e0d440..badaa4d68cc4 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
> @@ -259,6 +259,8 @@ struct kfd_dev;
>  struct kfd_dev_pc_sampling_data {
>       uint32_t use_count;         /* Num of PC sampling sessions */
>       uint32_t active_count;      /* Num of active sessions */
> +     uint32_t target_simd;       /* target simd for trap */
> +     uint32_t target_wave_slot;  /* target wave slot for trap */
>       bool stop_enable;           /* pc sampling stop in process */
>       struct idr pc_sampling_idr;
>       struct kfd_pc_sample_info pc_sample_info;
> --
> 2.25.1



More information about the amd-gfx mailing list