diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 37 |
1 files changed, 4 insertions, 33 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index a4982f53f937..0f9800b7e5a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | |||
@@ -1116,43 +1116,14 @@ static void amdgpu_fence_wait_cb(struct fence *fence, struct fence_cb *cb) | |||
1116 | static signed long amdgpu_fence_default_wait(struct fence *f, bool intr, | 1116 | static signed long amdgpu_fence_default_wait(struct fence *f, bool intr, |
1117 | signed long t) | 1117 | signed long t) |
1118 | { | 1118 | { |
1119 | struct amdgpu_fence *array[AMDGPU_MAX_RINGS]; | ||
1119 | struct amdgpu_fence *fence = to_amdgpu_fence(f); | 1120 | struct amdgpu_fence *fence = to_amdgpu_fence(f); |
1120 | struct amdgpu_device *adev = fence->ring->adev; | 1121 | struct amdgpu_device *adev = fence->ring->adev; |
1121 | struct amdgpu_wait_cb cb; | ||
1122 | 1122 | ||
1123 | cb.task = current; | 1123 | memset(&array[0], 0, sizeof(array)); |
1124 | array[0] = fence; | ||
1124 | 1125 | ||
1125 | if (fence_add_callback(f, &cb.base, amdgpu_fence_wait_cb)) | 1126 | return amdgpu_fence_wait_any(adev, array, intr, t); |
1126 | return t; | ||
1127 | |||
1128 | while (t > 0) { | ||
1129 | if (intr) | ||
1130 | set_current_state(TASK_INTERRUPTIBLE); | ||
1131 | else | ||
1132 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
1133 | |||
1134 | /* | ||
1135 | * amdgpu_test_signaled must be called after | ||
1136 | * set_current_state to prevent a race with wake_up_process | ||
1137 | */ | ||
1138 | if (amdgpu_test_signaled(fence)) | ||
1139 | break; | ||
1140 | |||
1141 | if (adev->needs_reset) { | ||
1142 | t = -EDEADLK; | ||
1143 | break; | ||
1144 | } | ||
1145 | |||
1146 | t = schedule_timeout(t); | ||
1147 | |||
1148 | if (t > 0 && intr && signal_pending(current)) | ||
1149 | t = -ERESTARTSYS; | ||
1150 | } | ||
1151 | |||
1152 | __set_current_state(TASK_RUNNING); | ||
1153 | fence_remove_callback(f, &cb.base); | ||
1154 | |||
1155 | return t; | ||
1156 | } | 1127 | } |
1157 | 1128 | ||
1158 | /* wait until any fence in array signaled */ | 1129 | /* wait until any fence in array signaled */ |