[PATCH 05/16] drm/amdkfd: Fix scheduler race in kfd_wait_on_events sleep loop
Oded Gabbay
oded.gabbay at gmail.com
Wed Oct 25 08:45:29 UTC 2017
On Sat, Oct 21, 2017 at 3:23 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> From: Sean Keely <sean.keely at amd.com>
>
> Signed-off-by: Sean Keely <sean.keely at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_events.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> index 64cc42c..c6d9572 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
> @@ -806,6 +806,17 @@ int kfd_wait_on_events(struct kfd_process *p,
> break;
> }
>
> + /* Set task state to interruptible sleep before
> + * checking wake-up conditions. A concurrent wake-up
> + * will put the task back into runnable state. In that
> + * case schedule_timeout will not put the task to
> + * sleep and we'll get a chance to re-check the
> + * updated conditions almost immediately. Otherwise,
> + * this race condition would lead to a soft hang or a
> + * very long sleep.
> + */
> + set_current_state(TASK_INTERRUPTIBLE);
> +
> if (test_event_condition(all, num_events, event_waiters)) {
> if (copy_signaled_event_data(num_events,
> event_waiters, events))
> @@ -820,7 +831,7 @@ int kfd_wait_on_events(struct kfd_process *p,
> break;
> }
>
> - timeout = schedule_timeout_interruptible(timeout);
> + timeout = schedule_timeout(timeout);
> }
> __set_current_state(TASK_RUNNING);
>
> --
> 2.7.4
>
This patch is:
Acked-by: Oded Gabbay <oded.gabbay at gmail.com>
More information about the amd-gfx
mailing list