rwsem: Move duplicate init macros and functions to linux/rwsem.h
The rwsem initializers and related macros and functions are mostly the
same. Some of them lack the lockdep initializer, but having it in
place does not matter for architectures which do not support lockdep.
powerpc, sparc, x86: No functional change
sh, s390: Removes the duplicate init_rwsem (inline and #define)
alpha, ia64, xtensa: Use the lockdep capable init function in
       	     	     lib/rwsem.c which is just uninlining the init
       	     	     function for the LOCKDEP=n case
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Matt Turner <mattst88@gmail.com>
Acked-by: Tony Luck <tony.luck@intel.com>
Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Acked-by: David Miller <davem@davemloft.net>
Cc: Chris Zankel <chris@zankel.net>
LKML-Reference: <20110126195833.771812729@linutronix.de>
	
	
This commit is contained in:
		
					parent
					
						
							
								1c8ed640d9
							
						
					
				
			
			
				commit
				
					
						12249b3441
					
				
			
		
					 10 changed files with 26 additions and 206 deletions
				
			
		| 
						 | 
					@ -26,20 +26,6 @@ extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock),	\
 | 
					 | 
				
			||||||
	LIST_HEAD_INIT((name).wait_list) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name) \
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void init_rwsem(struct rw_semaphore *sem)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	sem->count = RWSEM_UNLOCKED_VALUE;
 | 
					 | 
				
			||||||
	spin_lock_init(&sem->wait_lock);
 | 
					 | 
				
			||||||
	INIT_LIST_HEAD(&sem->wait_list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void __down_read(struct rw_semaphore *sem)
 | 
					static inline void __down_read(struct rw_semaphore *sem)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	long oldcount;
 | 
						long oldcount;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,26 +34,11 @@
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
 | 
					 | 
				
			||||||
	  LIST_HEAD_INIT((name).wait_list) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name) \
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void
 | 
					 | 
				
			||||||
init_rwsem (struct rw_semaphore *sem)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	sem->count = RWSEM_UNLOCKED_VALUE;
 | 
					 | 
				
			||||||
	spin_lock_init(&sem->wait_lock);
 | 
					 | 
				
			||||||
	INIT_LIST_HEAD(&sem->wait_list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,38 +28,11 @@
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name)				\
 | 
					 | 
				
			||||||
{								\
 | 
					 | 
				
			||||||
	RWSEM_UNLOCKED_VALUE,					\
 | 
					 | 
				
			||||||
	__SPIN_LOCK_UNLOCKED((name).wait_lock),			\
 | 
					 | 
				
			||||||
	LIST_HEAD_INIT((name).wait_list)			\
 | 
					 | 
				
			||||||
	__RWSEM_DEP_MAP_INIT(name)				\
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name)		\
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)					\
 | 
					 | 
				
			||||||
	do {						\
 | 
					 | 
				
			||||||
		static struct lock_class_key __key;	\
 | 
					 | 
				
			||||||
							\
 | 
					 | 
				
			||||||
		__init_rwsem((sem), #sem, &__key);	\
 | 
					 | 
				
			||||||
	} while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,41 +63,6 @@ extern struct rw_semaphore *rwsem_downgrade_write(struct rw_semaphore *);
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS	RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS	RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS	(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS	(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * initialisation
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
 { RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait.lock), \
 | 
					 | 
				
			||||||
   LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name) \
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void init_rwsem(struct rw_semaphore *sem)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	sem->count = RWSEM_UNLOCKED_VALUE;
 | 
					 | 
				
			||||||
	spin_lock_init(&sem->wait_lock);
 | 
					 | 
				
			||||||
	INIT_LIST_HEAD(&sem->wait_list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)				\
 | 
					 | 
				
			||||||
do {						\
 | 
					 | 
				
			||||||
	static struct lock_class_key __key;	\
 | 
					 | 
				
			||||||
						\
 | 
					 | 
				
			||||||
	__init_rwsem((sem), #sem, &__key);	\
 | 
					 | 
				
			||||||
} while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,42 +19,11 @@
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
 | 
					 | 
				
			||||||
	  LIST_HEAD_INIT((name).wait_list) \
 | 
					 | 
				
			||||||
	  __RWSEM_DEP_MAP_INIT(name) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name)		\
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)				\
 | 
					 | 
				
			||||||
do {						\
 | 
					 | 
				
			||||||
	static struct lock_class_key __key;	\
 | 
					 | 
				
			||||||
						\
 | 
					 | 
				
			||||||
	__init_rwsem((sem), #sem, &__key);	\
 | 
					 | 
				
			||||||
} while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline void init_rwsem(struct rw_semaphore *sem)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	sem->count = RWSEM_UNLOCKED_VALUE;
 | 
					 | 
				
			||||||
	spin_lock_init(&sem->wait_lock);
 | 
					 | 
				
			||||||
	INIT_LIST_HEAD(&sem->wait_list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,34 +20,11 @@
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
 | 
					 | 
				
			||||||
  LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name) \
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)						\
 | 
					 | 
				
			||||||
do {								\
 | 
					 | 
				
			||||||
	static struct lock_class_key __key;			\
 | 
					 | 
				
			||||||
								\
 | 
					 | 
				
			||||||
	__init_rwsem((sem), #sem, &__key);			\
 | 
					 | 
				
			||||||
} while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,31 +66,6 @@ extern asmregparm struct rw_semaphore *
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name)				\
 | 
					 | 
				
			||||||
{								\
 | 
					 | 
				
			||||||
	RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
 | 
					 | 
				
			||||||
	LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name)					\
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)						\
 | 
					 | 
				
			||||||
do {								\
 | 
					 | 
				
			||||||
	static struct lock_class_key __key;			\
 | 
					 | 
				
			||||||
								\
 | 
					 | 
				
			||||||
	__init_rwsem((sem), #sem, &__key);			\
 | 
					 | 
				
			||||||
} while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,25 +24,11 @@
 | 
				
			||||||
#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
					#define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS
 | 
				
			||||||
#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
					#define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock),	\
 | 
					 | 
				
			||||||
	  LIST_HEAD_INIT((name).wait_list) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name)		\
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
 | 
				
			||||||
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
					extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void init_rwsem(struct rw_semaphore *sem)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	sem->count = RWSEM_UNLOCKED_VALUE;
 | 
					 | 
				
			||||||
	spin_lock_init(&sem->wait_lock);
 | 
					 | 
				
			||||||
	INIT_LIST_HEAD(&sem->wait_list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,28 +29,7 @@ struct rw_semaphore {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
					#define RWSEM_UNLOCKED_VALUE		0x00000000
 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __RWSEM_INITIALIZER(name) \
 | 
					 | 
				
			||||||
{ 0, __SPIN_LOCK_UNLOCKED(name.wait_lock), LIST_HEAD_INIT((name).wait_list) \
 | 
					 | 
				
			||||||
  __RWSEM_DEP_MAP_INIT(name) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DECLARE_RWSEM(name) \
 | 
					 | 
				
			||||||
	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
					 | 
				
			||||||
			 struct lock_class_key *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define init_rwsem(sem)						\
 | 
					 | 
				
			||||||
do {								\
 | 
					 | 
				
			||||||
	static struct lock_class_key __key;			\
 | 
					 | 
				
			||||||
								\
 | 
					 | 
				
			||||||
	__init_rwsem((sem), #sem, &__key);			\
 | 
					 | 
				
			||||||
} while (0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void __down_read(struct rw_semaphore *sem);
 | 
					extern void __down_read(struct rw_semaphore *sem);
 | 
				
			||||||
extern int __down_read_trylock(struct rw_semaphore *sem);
 | 
					extern int __down_read_trylock(struct rw_semaphore *sem);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,31 @@ struct rw_semaphore {
 | 
				
			||||||
#include <asm/rwsem.h>
 | 
					#include <asm/rwsem.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Common initializer macros and functions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
				
			||||||
 | 
					# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# define __RWSEM_DEP_MAP_INIT(lockname)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __RWSEM_INITIALIZER(name) \
 | 
				
			||||||
 | 
						{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED(name.wait_lock),	\
 | 
				
			||||||
 | 
						  LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DECLARE_RWSEM(name) \
 | 
				
			||||||
 | 
						struct rw_semaphore name = __RWSEM_INITIALIZER(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
 | 
				
			||||||
 | 
								 struct lock_class_key *key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define init_rwsem(sem)						\
 | 
				
			||||||
 | 
					do {								\
 | 
				
			||||||
 | 
						static struct lock_class_key __key;			\
 | 
				
			||||||
 | 
													\
 | 
				
			||||||
 | 
						__init_rwsem((sem), #sem, &__key);			\
 | 
				
			||||||
 | 
					} while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * lock for reading
 | 
					 * lock for reading
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue