Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Aug 2010 08:38:26 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r210790 - projects/ofed/head/sys/ofed/include/linux
Message-ID:  <201008030838.o738cQaS090469@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Tue Aug  3 08:38:25 2010
New Revision: 210790
URL: http://svn.freebsd.org/changeset/base/210790

Log:
   - Convert the linux semaphores to use BSD sempahores rather than sx locks.
     There are places where we need counting semaphore semantics.  This is
     unfortunate since sema(9) is not implemented with the most expedient
     possible mechanism.
  
  Sponsored by:	Isilon Systems, iX Systems, and Panasas.

Modified:
  projects/ofed/head/sys/ofed/include/linux/semaphore.h

Modified: projects/ofed/head/sys/ofed/include/linux/semaphore.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/semaphore.h	Tue Aug  3 08:37:16 2010	(r210789)
+++ projects/ofed/head/sys/ofed/include/linux/semaphore.h	Tue Aug  3 08:38:25 2010	(r210790)
@@ -30,25 +30,35 @@
 
 #include <sys/param.h>
 #include <sys/lock.h>
-#include <sys/sx.h>
+#include <sys/sema.h>
 
+/*
+ * XXX BSD semaphores are disused and slow.  They also do not provide a
+ * sema_wait_sig method.  This must be resolved eventually.
+ */
 struct semaphore {
-	struct sx sx;
+	struct sema	sema;
 };
 
-#define	init_MUTEX(_rw)			sx_init_flags(&(_rw)->sx,	\
-					    "lnxsema", SX_NOWITNESS)
-#define	down(_rw)			sx_xlock(&(_rw)->sx)
-#define	down_interruptible(_rw)		sx_xlock_sig(&(_rw)->sx)
-#define	down_trylock(_rw)		!sx_try_xlock(&(_rw)->sx)
-#define	up(_rw)				sx_xunlock(&(_rw)->sx)
+#define	down(_sem)			sema_wait(&(_sem)->sema)
+#define	down_interruptible(_sem)	sema_wait(&(_sem)->sema), 0
+#define	down_trylock(_sem)		!sema_trywait(&(_sem)->sema)
+#define	up(_sem)			sema_post(&(_sem)->sema)
 
 static inline void
-sema_init(struct semaphore *sem, int val)
+linux_sema_init(struct semaphore *sem, int val)
 {
-	init_MUTEX(sem);
-	if (val == 0)
-		down(sem);
+
+	sema_init(&sem->sema, val, "lnxsema");
 }
 
+static inline void
+init_MUTEX(struct semaphore *sem)
+{
+
+	sema_init(&sem->sema, 1, "lnxsema");
+}
+
+#define	sema_init	linux_sema_init
+
 #endif /* _LINUX_SEMAPHORE_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008030838.o738cQaS090469>