drm/amdkfd: Fix scheduler race in kfd_wait_on_events sleep loop
Signed-off-by: Sean Keely <sean.keely@amd.com> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
1f9d09becb
commit
d9aeec4cbb
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user