aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-10-20 11:38:07 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-10-30 01:51:11 -0400
commitee327caf1a2cdba9313167c36db2d7ff02d534bc (patch)
treec09c7b851e4a819944375b0c420cc2e689550c4e /drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
parent318cd340c5573a1f021f5b7711893133fe5e8480 (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.c20
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)