Module Name:    src
Committed By:   riastradh
Date:           Wed Jul 24 02:20:38 UTC 2013

Modified Files:
        src/sys/external/bsd/drm2/include/drm [riastradh-drm2]:
            drm_wait_netbsd.h

Log Message:
Add variants of drm wait/wakeup for spin locks in drm_wait_netbsd.h.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 \
    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/include/drm/drm_wait_netbsd.h
diff -u src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.2 src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.3
--- src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.1.2.2	Wed Jul 24 02:03:16 2013
+++ src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h	Wed Jul 24 02:20:38 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_wait_netbsd.h,v 1.1.2.2 2013/07/24 02:03:16 riastradh Exp $	*/
+/*	$NetBSD: drm_wait_netbsd.h,v 1.1.2.3 2013/07/24 02:20:38 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -37,9 +37,9 @@
 #include <sys/systm.h>
 
 #include <linux/mutex.h>
+#include <linux/spinlock.h>
 
 typedef kcondvar_t drm_waitqueue_t;
-typedef struct mutex drm_interlock_t; /* XXX urk */
 
 static inline void
 DRM_INIT_WAITQUEUE(drm_waitqueue_t *q, const char *name)
@@ -48,24 +48,74 @@ DRM_INIT_WAITQUEUE(drm_waitqueue_t *q, c
 }
 
 static inline void
-DRM_WAKEUP_ONE(drm_waitqueue_t *q, drm_interlock_t *interlock)
+DRM_WAKEUP_ONE(drm_waitqueue_t *q, struct mutex *interlock)
 {
-	KASSERT(mutex_owned(&interlock->mtx_lock));
+	KASSERT(mutex_is_locked(interlock));
 	cv_signal(q);
 }
 
 static inline void
-DRM_WAKEUP_ALL(drm_waitqueue_t *q, drm_interlock_t *interlock)
+DRM_WAKEUP_ALL(drm_waitqueue_t *q, struct mutex *interlock)
 {
-	KASSERT(mutex_owned(&interlock->mtx_lock));
+	KASSERT(mutex_is_locked(interlock));
 	cv_broadcast(q);
 }
 
-#define	DRM_WAIT_ON(RET, Q, INTERLOCK, TICKS, CONDITION) do		\
+static inline void
+DRM_SPIN_WAKEUP_ONE(drm_waitqueue_t *q, spinlock_t *interlock)
+{
+	KASSERT(spin_is_locked(interlock));
+	cv_signal(q);
+}
+
+static inline void
+DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, spinlock_t *interlock)
+{
+	KASSERT(spin_is_locked(interlock));
+	cv_broadcast(q);
+}
+
+#define	DRM_WAIT_UNTIL(RET, Q, INTERLOCK, CONDITION)	do		\
+{									\
+	KASSERT(mutex_is_locked((INTERLOCK)));				\
+	while (!(CONDITION)) {						\
+		/* XXX errno NetBSD->Linux */				\
+		(RET) = -cv_wait_sig((Q), &(INTERLOCK)->mtx_lock);	\
+		if (RET)						\
+			break;						\
+	}								\
+} while (0)
+
+#define	DRM_TIMED_WAIT_UNTIL(RET, Q, INTERLOCK, TICKS, CONDITION) do	\
+{									\
+	KASSERT(mutex_is_locked((INTERLOCK)));				\
+	while (!(CONDITION)) {						\
+		/* XXX errno NetBSD->Linux */				\
+		(RET) = -cv_timedwait_sig((Q), &(INTERLOCK)->mtx_lock,	\
+		    (TICKS));						\
+		if (RET)						\
+			break;						\
+	}								\
+} while (0)
+
+#define	DRM_SPIN_WAIT_UNTIL(RET, Q, INTERLOCK, CONDITION)	do	\
+{									\
+	KASSERT(spin_is_locked((INTERLOCK)));				\
+	while (!(CONDITION)) {						\
+		/* XXX errno NetBSD->Linux */				\
+		(RET) = -cv_wait_sig((Q), &(INTERLOCK)->sl_lock);	\
+		if (RET)						\
+			break;						\
+	}								\
+} while (0)
+
+#define	DRM_SPIN_TIMED_WAIT_UNTIL(RET, Q, INTERLOCK, TICKS, CONDITION)	\
+	do								\
 {									\
-	KASSERT(mutex_owned(&(INTERLOCK)->mtx_lock));			\
+	KASSERT(spin_is_locked((INTERLOCK)));				\
 	while (!(CONDITION)) {						\
-		(RET) = cv_timedwait_sig((Q), &(INTERLOCK)->mtx_lock,	\
+		/* XXX errno NetBSD->Linux */				\
+		(RET) = -cv_timedwait_sig((Q), &(INTERLOCK)->sl_lock,	\
 		    (TICKS));						\
 		if (RET)						\
 			break;						\

Reply via email to