19
22
#ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
20
23
#include <linux/rwsem-spinlock.h> /* use a generic implementation */
22
#include <asm/rwsem.h> /* use an arch-specific implementation */
25
/* All arch specific implementations share the same struct */
29
struct list_head wait_list;
30
#ifdef CONFIG_DEBUG_LOCK_ALLOC
31
struct lockdep_map dep_map;
35
extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
36
extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
37
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *);
38
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
40
/* Include the arch specific part */
41
#include <asm/rwsem.h>
43
/* In all implementations count != 0 means locked */
44
static inline int rwsem_is_locked(struct rw_semaphore *sem)
46
return sem->count != 0;
51
/* Common initializer macros and functions */
53
#ifdef CONFIG_DEBUG_LOCK_ALLOC
54
# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
56
# define __RWSEM_DEP_MAP_INIT(lockname)
59
#define __RWSEM_INITIALIZER(name) \
60
{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED(name.wait_lock), \
61
LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
63
#define DECLARE_RWSEM(name) \
64
struct rw_semaphore name = __RWSEM_INITIALIZER(name)
66
extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
67
struct lock_class_key *key);
69
#define init_rwsem(sem) \
71
static struct lock_class_key __key; \
73
__init_rwsem((sem), #sem, &__key); \