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_ */

Reply via email to