Module Name: src Committed By: riastradh Date: Wed Mar 5 22:18:10 UTC 2014
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915 [riastradh-drm2]: i915_gem.c intel_display.c src/sys/external/bsd/drm2/include/drm [riastradh-drm2]: drm_wait_netbsd.h Log Message: Implement and use non-interruptible DRM_WAIT_* gizmos. To generate a diff of this commit: cvs rdiff -u -r1.1.1.1.2.20 -r1.1.1.1.2.21 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c cvs rdiff -u -r1.1.1.1.2.9 -r1.1.1.1.2.10 \ src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c cvs rdiff -u -r1.1.2.8 -r1.1.2.9 \ src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.20 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.21 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.20 Tue Jan 21 20:57:00 2014 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Wed Mar 5 22:18:10 2014 @@ -1195,14 +1195,16 @@ static int __wait_seqno(struct intel_rin #ifdef __NetBSD__ unsigned long flags; spin_lock_irqsave(&dev_priv->irq_lock, flags); - /* - * XXX This wait is always interruptible; we should - * heed the flag `interruptible'. - */ - DRM_SPIN_TIMED_WAIT_UNTIL(end, &ring->irq_queue, - &dev_priv->irq_lock, - timeout_jiffies, - EXIT_COND); + if (interruptible) + DRM_SPIN_TIMED_WAIT_UNTIL(end, &ring->irq_queue, + &dev_priv->irq_lock, + timeout_jiffies, + EXIT_COND); + else + DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(end, &ring->irq_queue, + &dev_priv->irq_lock, + timeout_jiffies, + EXIT_COND); spin_unlock_irqrestore(&dev_priv->irq_lock, flags); #else if (interruptible) Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.9 src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.10 --- src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.9 Sun Sep 8 16:38:51 2013 +++ src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c Wed Mar 5 22:18:10 2014 @@ -2248,14 +2248,12 @@ intel_finish_fb(struct drm_framebuffer * bool was_interruptible = dev_priv->mm.interruptible; int ret; -#ifdef __NetBSD__ /* XXX DRM_WAIT_UNINTERRUPTIBLE_UNTIL */ +#ifdef __NetBSD__ mutex_lock(&dev_priv->pending_flip_lock); - do { - DRM_WAIT_UNTIL(ret, &dev_priv->pending_flip_queue, - &dev_priv->pending_flip_lock, - (atomic_read(&dev_priv->mm.wedged) || - atomic_read(&obj->pending_flip) == 0)); - } while (ret); + DRM_WAIT_NOINTR_UNTIL(ret, &dev_priv->pending_flip_queue, + &dev_priv->pending_flip_lock, + (atomic_read(&dev_priv->mm.wedged) || + atomic_read(&obj->pending_flip) == 0)); mutex_unlock(&dev_priv->pending_flip_lock); #else wait_event(dev_priv->pending_flip_queue, @@ -2970,13 +2968,11 @@ static void intel_crtc_wait_for_pending_ if (crtc->fb == NULL) return; -#ifdef __NetBSD__ /* XXX DRM_WAIT_UNINTERRUPTIBLE_UNTIL */ +#ifdef __NetBSD__ mutex_lock(&dev_priv->pending_flip_lock); - do { - DRM_WAIT_UNTIL(error, &dev_priv->pending_flip_queue, - &dev_priv->pending_flip_lock, - !intel_crtc_has_pending_flip(crtc)); - } while (error); + DRM_WAIT_NOINTR_UNTIL(error, &dev_priv->pending_flip_queue, + &dev_priv->pending_flip_lock, + !intel_crtc_has_pending_flip(crtc)); mutex_unlock(&dev_priv->pending_flip_lock); #else wait_event(dev_priv->pending_flip_queue, Index: src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h diff -u src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.8 src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.9 --- src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.8 Sun Sep 8 16:35:20 2013 +++ src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h Wed Mar 5 22:18:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_wait_netbsd.h,v 1.1.2.8 2013/09/08 16:35:20 riastradh Exp $ */ +/* $NetBSD: drm_wait_netbsd.h,v 1.1.2.9 2014/03/05 22:18:10 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -99,7 +99,7 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, cv_broadcast(q); } -#define DRM_WAIT_UNTIL(RET, Q, INTERLOCK, CONDITION) do \ +#define _DRM_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, CONDITION) do \ { \ KASSERT(mutex_is_locked((INTERLOCK))); \ for (;;) { \ @@ -108,13 +108,21 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, break; \ } \ /* XXX errno NetBSD->Linux */ \ - (RET) = -cv_wait_sig((Q), &(INTERLOCK)->mtx_lock); \ + (RET) = -WAIT((Q), &(INTERLOCK)->mtx_lock); \ if (RET) \ break; \ } \ } while (0) -#define DRM_TIMED_WAIT_UNTIL(RET, Q, INTERLOCK, TICKS, CONDITION) do \ +#define cv_wait_nointr(Q, I) (cv_wait((Q), (I)), 0) + +#define DRM_WAIT_NOINTR_UNTIL(RET, Q, I, C) \ + _DRM_WAIT_UNTIL(RET, cv_wait_nointr, Q, I, C) + +#define DRM_WAIT_UNTIL(RET, Q, I, C) \ + _DRM_WAIT_UNTIL(RET, cv_wait_sig, Q, I, C) + +#define _DRM_TIMED_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, TICKS, CONDITION) do \ { \ extern int hardclock_ticks; \ const int _dtwu_start = hardclock_ticks; \ @@ -126,7 +134,7 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, break; \ } \ /* XXX errno NetBSD->Linux */ \ - (RET) = -cv_timedwait_sig((Q), &(INTERLOCK)->mtx_lock, \ + (RET) = -WAIT((Q), &(INTERLOCK)->mtx_lock, \ _dtwu_ticks); \ if (RET) \ break; \ @@ -141,18 +149,30 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, } \ } while (0) -#define DRM_SPIN_WAIT_UNTIL(RET, Q, INTERLOCK, CONDITION) do \ +#define DRM_TIMED_WAIT_NOINTR_UNTIL(RET, Q, I, T, C) \ + _DRM_TIMED_WAIT_UNTIL(RET, cv_timedwait, Q, I, T, C) + +#define DRM_TIMED_WAIT_UNTIL(RET, Q, I, T, C) \ + _DRM_TIMED_WAIT_UNTIL(RET, cv_timedwait_sig, Q, I, T, C) + +#define _DRM_SPIN_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, CONDITION) do \ { \ KASSERT(spin_is_locked((INTERLOCK))); \ while (!(CONDITION)) { \ /* XXX errno NetBSD->Linux */ \ - (RET) = -cv_wait_sig((Q), &(INTERLOCK)->sl_lock); \ + (RET) = -WAIT((Q), &(INTERLOCK)->sl_lock); \ if (RET) \ break; \ } \ } while (0) -#define DRM_SPIN_TIMED_WAIT_UNTIL(RET, Q, INTERLOCK, TICKS, CONDITION) \ +#define DRM_SPIN_WAIT_NOINTR_UNTIL(RET, Q, I, C) \ + _DRM_SPIN_WAIT_UNTIL(RET, cv_wait_nointr, Q, I, C) + +#define DRM_SPIN_WAIT_UNTIL(RET, Q, I, C) \ + _DRM_SPIN_WAIT_UNTIL(RET, cv_wait_sig, Q, I, C) + +#define _DRM_SPIN_TIMED_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, TICKS, CONDITION) \ do \ { \ extern int hardclock_ticks; \ @@ -165,7 +185,7 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, break; \ } \ /* XXX errno NetBSD->Linux */ \ - (RET) = -cv_timedwait_sig((Q), &(INTERLOCK)->sl_lock, \ + (RET) = -WAIT((Q), &(INTERLOCK)->sl_lock, \ _dstwu_ticks); \ if (RET) \ break; \ @@ -180,4 +200,10 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, } \ } while (0) +#define DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(RET, Q, I, T, C) \ + _DRM_SPIN_TIMED_WAIT_UNTIL(RET, cv_timedwait, Q, I, T, C) + +#define DRM_SPIN_TIMED_WAIT_UNTIL(RET, Q, I, T, C) \ + _DRM_SPIN_TIMED_WAIT_UNTIL(RET, cv_timedwait_sig, Q, I, T, C) + #endif /* _DRM_DRM_WAIT_NETBSD_H_ */