1 #ifndef _LINUX_PERCPU_RWSEM_H 2 #define _LINUX_PERCPU_RWSEM_H 3 4 #include <linux/atomic.h> 5 #include <linux/rwsem.h> 6 #include <linux/percpu.h> 7 #include <linux/wait.h> 8 #include <linux/lockdep.h> 9 10 struct percpu_rw_semaphore { 11 unsigned int __percpu *fast_read_ctr; 12 atomic_t write_ctr; 13 struct rw_semaphore rw_sem; 14 atomic_t slow_read_ctr; 15 wait_queue_head_t write_waitq; 16 }; 17 18 extern void percpu_down_read(struct percpu_rw_semaphore *); 19 extern void percpu_up_read(struct percpu_rw_semaphore *); 20 21 extern void percpu_down_write(struct percpu_rw_semaphore *); 22 extern void percpu_up_write(struct percpu_rw_semaphore *); 23 24 extern int __percpu_init_rwsem(struct percpu_rw_semaphore *, 25 const char *, struct lock_class_key *); 26 extern void percpu_free_rwsem(struct percpu_rw_semaphore *); 27 28 #define percpu_init_rwsem(brw) \ 29 ({ \ 30 static struct lock_class_key rwsem_key; \ 31 __percpu_init_rwsem(brw, #brw, &rwsem_key); \ 32 }) 33 34 #endif 35