Mon Mar 2 17:53:00 2015 UTC ()
Return the error if there is one in radeon_fence_wait_seq.

Don't just always say we succeeded!


(riastradh)
diff -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c

cvs diff -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c 2014/08/06 22:12:51 1.5
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c 2015/03/02 17:53:00 1.6
@@ -313,27 +313,27 @@ static bool radeon_fence_any_seq_signale @@ -313,27 +313,27 @@ static bool radeon_fence_any_seq_signale
313 * Wait for the requested sequence number(s) to be written by any ring 313 * Wait for the requested sequence number(s) to be written by any ring
314 * (all asics). Sequnce number array is indexed by ring id. 314 * (all asics). Sequnce number array is indexed by ring id.
315 * @intr selects whether to use interruptable (true) or non-interruptable 315 * @intr selects whether to use interruptable (true) or non-interruptable
316 * (false) sleep when waiting for the sequence number. Helper function 316 * (false) sleep when waiting for the sequence number. Helper function
317 * for radeon_fence_wait_*(). 317 * for radeon_fence_wait_*().
318 * Returns 0 if the sequence number has passed, error for all other cases. 318 * Returns 0 if the sequence number has passed, error for all other cases.
319 * -EDEADLK is returned when a GPU lockup has been detected. 319 * -EDEADLK is returned when a GPU lockup has been detected.
320 */ 320 */
321static int radeon_fence_wait_seq(struct radeon_device *rdev, u64 *target_seq, 321static int radeon_fence_wait_seq(struct radeon_device *rdev, u64 *target_seq,
322 bool intr) 322 bool intr)
323{ 323{
324 uint64_t last_seq[RADEON_NUM_RINGS]; 324 uint64_t last_seq[RADEON_NUM_RINGS];
325 bool signaled; 325 bool signaled;
326 int i, r; 326 int i, r = 0;
327 327
328 spin_lock(&rdev->fence_lock); 328 spin_lock(&rdev->fence_lock);
329 while (!radeon_fence_any_seq_signaled(rdev, target_seq)) { 329 while (!radeon_fence_any_seq_signaled(rdev, target_seq)) {
330 330
331 /* Save current sequence values, used to check for GPU lockups */ 331 /* Save current sequence values, used to check for GPU lockups */
332 for (i = 0; i < RADEON_NUM_RINGS; ++i) { 332 for (i = 0; i < RADEON_NUM_RINGS; ++i) {
333 if (!target_seq[i]) 333 if (!target_seq[i])
334 continue; 334 continue;
335 335
336 last_seq[i] = atomic64_read(&rdev->fence_drv[i].last_seq); 336 last_seq[i] = atomic64_read(&rdev->fence_drv[i].last_seq);
337 trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]); 337 trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
338 radeon_irq_kms_sw_irq_get(rdev, i); 338 radeon_irq_kms_sw_irq_get(rdev, i);
339 } 339 }
@@ -415,27 +415,27 @@ static int radeon_fence_wait_seq(struct  @@ -415,27 +415,27 @@ static int radeon_fence_wait_seq(struct
415 rdev->needs_reset = true; 415 rdev->needs_reset = true;
416#ifdef __NetBSD__ 416#ifdef __NetBSD__
417 DRM_SPIN_WAKEUP_ALL(&rdev->fence_queue, 417 DRM_SPIN_WAKEUP_ALL(&rdev->fence_queue,
418 &rdev->fence_lock); 418 &rdev->fence_lock);
419#else 419#else
420 wake_up_all(&rdev->fence_queue); 420 wake_up_all(&rdev->fence_queue);
421#endif 421#endif
422 r = -EDEADLK; 422 r = -EDEADLK;
423 goto out; 423 goto out;
424 } 424 }
425 } 425 }
426 } 426 }
427out: spin_unlock(&rdev->fence_lock); 427out: spin_unlock(&rdev->fence_lock);
428 return 0; 428 return r;
429} 429}
430 430
431/** 431/**
432 * radeon_fence_wait - wait for a fence to signal 432 * radeon_fence_wait - wait for a fence to signal
433 * 433 *
434 * @fence: radeon fence object 434 * @fence: radeon fence object
435 * @intr: use interruptable sleep 435 * @intr: use interruptable sleep
436 * 436 *
437 * Wait for the requested fence to signal (all asics). 437 * Wait for the requested fence to signal (all asics).
438 * @intr selects whether to use interruptable (true) or non-interruptable 438 * @intr selects whether to use interruptable (true) or non-interruptable
439 * (false) sleep when waiting for the fence. 439 * (false) sleep when waiting for the fence.
440 * Returns 0 if the fence has passed, error for all other cases. 440 * Returns 0 if the fence has passed, error for all other cases.
441 */ 441 */