diff options
author | Christian König <christian.koenig@amd.com> | 2015-10-20 11:38:07 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-10-30 01:51:11 -0400 |
commit | ee327caf1a2cdba9313167c36db2d7ff02d534bc (patch) | |
tree | c09c7b851e4a819944375b0c420cc2e689550c4e /drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | |
parent | 318cd340c5573a1f021f5b7711893133fe5e8480 (diff) |
drm/amdgpu: switch to common fence_wait_any_timeout v2
No need to duplicate the functionality any more.
v2: fix handling if no fence is available.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com> (v1)
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c index 5cb27d525e43..3f48759793de 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | |||
@@ -337,6 +337,7 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev, | |||
337 | { | 337 | { |
338 | struct fence *fences[AMDGPU_MAX_RINGS]; | 338 | struct fence *fences[AMDGPU_MAX_RINGS]; |
339 | unsigned tries[AMDGPU_MAX_RINGS]; | 339 | unsigned tries[AMDGPU_MAX_RINGS]; |
340 | unsigned count; | ||
340 | int i, r; | 341 | int i, r; |
341 | signed long t; | 342 | signed long t; |
342 | 343 | ||
@@ -371,13 +372,18 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev, | |||
371 | /* see if we can skip over some allocations */ | 372 | /* see if we can skip over some allocations */ |
372 | } while (amdgpu_sa_bo_next_hole(sa_manager, fences, tries)); | 373 | } while (amdgpu_sa_bo_next_hole(sa_manager, fences, tries)); |
373 | 374 | ||
374 | spin_unlock(&sa_manager->wq.lock); | 375 | for (i = 0, count = 0; i < AMDGPU_MAX_RINGS; ++i) |
375 | t = amdgpu_fence_wait_any(fences, AMDGPU_MAX_RINGS, | 376 | if (fences[i]) |
376 | false, MAX_SCHEDULE_TIMEOUT); | 377 | fences[count++] = fences[i]; |
377 | r = (t > 0) ? 0 : t; | 378 | |
378 | spin_lock(&sa_manager->wq.lock); | 379 | if (count) { |
379 | /* if we have nothing to wait for block */ | 380 | spin_unlock(&sa_manager->wq.lock); |
380 | if (r == -ENOENT) { | 381 | t = fence_wait_any_timeout(fences, count, false, |
382 | MAX_SCHEDULE_TIMEOUT); | ||
383 | r = (t > 0) ? 0 : t; | ||
384 | spin_lock(&sa_manager->wq.lock); | ||
385 | } else { | ||
386 | /* if we have nothing to wait for block */ | ||
381 | r = wait_event_interruptible_locked( | 387 | r = wait_event_interruptible_locked( |
382 | sa_manager->wq, | 388 | sa_manager->wq, |
383 | amdgpu_sa_event(sa_manager, size, align) | 389 | amdgpu_sa_event(sa_manager, size, align) |