]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - include/linux/percpu-rwsem.h
xfrm: dst_entries_init() per-net dst_ops
[karo-tx-linux.git] / include / linux / percpu-rwsem.h
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 int  percpu_down_read_trylock(struct percpu_rw_semaphore *);
20 extern void percpu_up_read(struct percpu_rw_semaphore *);
21
22 extern void percpu_down_write(struct percpu_rw_semaphore *);
23 extern void percpu_up_write(struct percpu_rw_semaphore *);
24
25 extern int __percpu_init_rwsem(struct percpu_rw_semaphore *,
26                                 const char *, struct lock_class_key *);
27 extern void percpu_free_rwsem(struct percpu_rw_semaphore *);
28
29 #define percpu_init_rwsem(brw)  \
30 ({                                                              \
31         static struct lock_class_key rwsem_key;                 \
32         __percpu_init_rwsem(brw, #brw, &rwsem_key);             \
33 })
34
35
36 #define percpu_rwsem_is_held(sem) lockdep_is_held(&(sem)->rw_sem)
37
38 static inline void percpu_rwsem_release(struct percpu_rw_semaphore *sem,
39                                         bool read, unsigned long ip)
40 {
41         lock_release(&sem->rw_sem.dep_map, 1, ip);
42 #ifdef CONFIG_RWSEM_SPIN_ON_OWNER
43         if (!read)
44                 sem->rw_sem.owner = NULL;
45 #endif
46 }
47
48 static inline void percpu_rwsem_acquire(struct percpu_rw_semaphore *sem,
49                                         bool read, unsigned long ip)
50 {
51         lock_acquire(&sem->rw_sem.dep_map, 0, 1, read, 1, NULL, ip);
52 }
53
54 #endif