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