[PATCH 07/24] drm/amdkfd: check pcs_enrty valid
James Zhu
jamesz at amd.com
Thu Nov 23 22:06:39 UTC 2023
On 2023-11-23 15:32, Felix Kuehling wrote:
>
> On 2023-11-23 15:18, James Zhu wrote:
>>
>> On 2023-11-22 17:15, Felix Kuehling wrote:
>>>
>>> On 2023-11-03 09:11, James Zhu wrote:
>>>> Check pcs_enrty valid for pc sampling ioctl.
>>>>
>>>> Signed-off-by: James Zhu <James.Zhu at amd.com>
>>>> ---
>>>> drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c | 30
>>>> ++++++++++++++++++--
>>>> 1 file 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 4c9fc48e1a6a..36366c8847de 100644
>>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
>>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
>>>> @@ -179,6 +179,21 @@ static int kfd_pc_sample_destroy(struct
>>>> kfd_process_device *pdd, uint32_t trace_
>>>> int kfd_pc_sample(struct kfd_process_device *pdd,
>>>> struct kfd_ioctl_pc_sample_args __user *args)
>>>> {
>>>> + struct pc_sampling_entry *pcs_entry;
>>>> +
>>>> + if (args->op != KFD_IOCTL_PCS_OP_QUERY_CAPABILITIES &&
>>>> + args->op != KFD_IOCTL_PCS_OP_CREATE) {
>>>> +
>>>> + mutex_lock(&pdd->dev->pcs_data.mutex);
>>>> + pcs_entry =
>>>> idr_find(&pdd->dev->pcs_data.hosttrap_entry.base.pc_sampling_idr,
>>>> + args->trace_id);
>>>> + mutex_unlock(&pdd->dev->pcs_data.mutex);
>>>
>>> You need to keep holding the lock while the pcs_entry is still used.
>>> That includes any of the kfd_pc_sample_<op> functions below.
>>> Otherwise someone could free it concurrently. It would also simplify
>>> the ..._<op> functions, if they didn't have to worry about the
>>> locking themselves.
>> [JZ] pcs_entry is only for this pc sampling process, which has
>> kfd_process->mutex protected here.
>
> OK. That's not obvious. I'm also wary about depending too much on the
> big process lock. We will need to make that locking more granular
> soon, because it is causing performance issues with multi-threaded
> processes.
[Jz] Let me add some comments on pcs_entry.
>
> Regards,
> Felix
>
>
>>>
>>> Regards,
>>> Felix
>>>
>>>
>>>> +
>>>> + if (!pcs_entry ||
>>>> + pcs_entry->pdd != pdd)
>>>> + return -EINVAL;
>>>> + }
>>>> +
>>>> switch (args->op) {
>>>> case KFD_IOCTL_PCS_OP_QUERY_CAPABILITIES:
>>>> return kfd_pc_sample_query_cap(pdd, args);
>>>> @@ -187,13 +202,22 @@ int kfd_pc_sample(struct kfd_process_device
>>>> *pdd,
>>>> return kfd_pc_sample_create(pdd, args);
>>>> case KFD_IOCTL_PCS_OP_DESTROY:
>>>> - return kfd_pc_sample_destroy(pdd, args->trace_id);
>>>> + if (pcs_entry->enabled)
>>>> + return -EBUSY;
>>>> + else
>>>> + return kfd_pc_sample_destroy(pdd, args->trace_id);
>>>> case KFD_IOCTL_PCS_OP_START:
>>>> - return kfd_pc_sample_start(pdd);
>>>> + if (pcs_entry->enabled)
>>>> + return -EALREADY;
>>>> + else
>>>> + return kfd_pc_sample_start(pdd);
>>>> case KFD_IOCTL_PCS_OP_STOP:
>>>> - return kfd_pc_sample_stop(pdd);
>>>> + if (!pcs_entry->enabled)
>>>> + return -EALREADY;
>>>> + else
>>>> + return kfd_pc_sample_stop(pdd);
>>>> }
>>>> return -EINVAL;
More information about the amd-gfx
mailing list