svn commit: r210790 - projects/ofed/head/sys/ofed/include/linux

Robert Watson rwatson at FreeBSD.org
Wed Aug 4 12:10:34 UTC 2010


On Tue, 3 Aug 2010, Jeff Roberson wrote:

>   - 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.

sema(9) also has near-zero consumers in the tree, hence a lack of optimization 
focus, etc.  In many ways it would be nice to make it go away simply to narrow 
the menu on synchronization primitives a bit.  Of course, that would mean not 
introducing new consumers... :-)

Robert

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


More information about the svn-src-projects mailing list