[PATCH v2 3/3] drm/amdkfd: don't sleep when event age unmatch

Felix Kuehling felix.kuehling at amd.com
Wed Jun 7 17:27:26 UTC 2023


On 2023-06-06 12:24, James Zhu wrote:
> Don't sleep when event age unmatch, and update last_event_age.
> It is only for KFD_EVENT_TYPE_SIGNAL which is checked by user space.
>
> Signed-off-by: James Zhu <James.Zhu at amd.com>
> ---
>   drivers/gpu/drm/amd/amdkfd/kfd_events.c | 15 +++++++++++++++
>   1 file changed, 15 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> index c7689181cc22..f4ceb5be78ed 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> @@ -952,6 +952,21 @@ int kfd_wait_on_events(struct kfd_process *p,
>   					event_data.event_id);
>   		if (ret)
>   			goto out_unlock;
> +
> +		/* last_event_age = 0 reserved for backward compatible */
> +		if (event_data.signal_event_data.last_event_age &&
> +			event_waiters[i].event->event_age !=
> +				event_data.signal_event_data.last_event_age) {
> +			event_data.signal_event_data.last_event_age =
> +				event_waiters[i].event->event_age;

The event_age is updated in set_event under the event->spin_lock. You 
need to take that lock for this check here as well.

I think the easiest way to do this would be to move the check into 
init_event_waiter. That way you can initialize the waiter as activated 
if the event age is not up to date.


> +			WRITE_ONCE(event_waiters[i].activated, true);
> +
> +			if (copy_to_user(&events[i], &event_data,
> +				sizeof(struct kfd_event_data))) {
> +				ret = -EFAULT;
> +				goto out_unlock;
> +			}
> +		}

I think we also need to update the event age in event data after an 
event has signaled. You should probably move updating and copying of the 
event age to user mode into copy_signaled_event_data. That way it would 
handle all the cases.

Regards,
   Felix


>   	}
>   
>   	/* Check condition once. */


More information about the amd-gfx mailing list