1/* 2 * include/asm-s390/semaphore.h 3 * 4 * S390 version 5 * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation 6 * 7 * Derived from "include/asm-i386/semaphore.h" 8 * (C) Copyright 1996 Linus Torvalds 9 */ 10 11#ifndef _S390_SEMAPHORE_H 12#define _S390_SEMAPHORE_H 13 14#include <asm/system.h> 15#include <asm/atomic.h> 16#include <linux/wait.h> 17#include <linux/rwsem.h> 18 19struct semaphore { 20 atomic_t count; 21 int sleepers; 22 wait_queue_head_t wait; 23}; 24 25#define __SEM_DEBUG_INIT(name) 26 27#define __SEMAPHORE_INITIALIZER(name,count) \ 28{ ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \ 29 __SEM_DEBUG_INIT(name) } 30 31#define __MUTEX_INITIALIZER(name) \ 32 __SEMAPHORE_INITIALIZER(name,1) 33 34#define __DECLARE_SEMAPHORE_GENERIC(name,count) \ 35 struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) 36 37#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) 38#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) 39 40static inline void sema_init (struct semaphore *sem, int val) 41{ 42 *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); 43} 44 45static inline void init_MUTEX (struct semaphore *sem) 46{ 47 sema_init(sem, 1); 48} 49 50static inline void init_MUTEX_LOCKED (struct semaphore *sem) 51{ 52 sema_init(sem, 0); 53} 54 55asmlinkage void __down_failed(void /* special register calling convention */); 56asmlinkage int __down_failed_interruptible(void /* params in registers */); 57asmlinkage int __down_failed_trylock(void /* params in registers */); 58asmlinkage void __up_wakeup(void /* special register calling convention */); 59 60asmlinkage void __down(struct semaphore * sem); 61asmlinkage int __down_interruptible(struct semaphore * sem); 62asmlinkage int __down_trylock(struct semaphore * sem); 63asmlinkage void __up(struct semaphore * sem); 64 65static inline void down(struct semaphore * sem) 66{ 67 if (atomic_dec_return(&sem->count) < 0) 68 __down(sem); 69} 70 71static inline int down_interruptible(struct semaphore * sem) 72{ 73 int ret = 0; 74 75 if (atomic_dec_return(&sem->count) < 0) 76 ret = __down_interruptible(sem); 77 return ret; 78} 79 80static inline int down_trylock(struct semaphore * sem) 81{ 82 int ret = 0; 83 84 if (atomic_dec_return(&sem->count) < 0) 85 ret = __down_trylock(sem); 86 return ret; 87} 88 89static inline void up(struct semaphore * sem) 90{ 91 if (atomic_inc_return(&sem->count) <= 0) 92 __up(sem); 93} 94 95static inline int sem_getcount(struct semaphore *sem) 96{ 97 return atomic_read(&sem->count); 98} 99 100#endif 101