1 /* See include/linux/lglock.h for description */
2 #include <linux/module.h>
3 #include <linux/lglock.h>
5 void lg_lock_init(struct lglock *lg, char *name)
7 LOCKDEP_INIT_MAP(&lg->lock_dep_map, name, &lg->lock_key, 0);
9 EXPORT_SYMBOL(lg_lock_init);
11 void lg_local_lock(struct lglock *lg)
13 arch_spinlock_t *lock;
15 rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_);
16 lock = this_cpu_ptr(lg->lock);
19 EXPORT_SYMBOL(lg_local_lock);
21 void lg_local_unlock(struct lglock *lg)
23 arch_spinlock_t *lock;
24 rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
25 lock = this_cpu_ptr(lg->lock);
26 arch_spin_unlock(lock);
29 EXPORT_SYMBOL(lg_local_unlock);
31 void lg_local_lock_cpu(struct lglock *lg, int cpu)
33 arch_spinlock_t *lock;
35 rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_);
36 lock = per_cpu_ptr(lg->lock, cpu);
39 EXPORT_SYMBOL(lg_local_lock_cpu);
41 void lg_local_unlock_cpu(struct lglock *lg, int cpu)
43 arch_spinlock_t *lock;
44 rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
45 lock = per_cpu_ptr(lg->lock, cpu);
46 arch_spin_unlock(lock);
49 EXPORT_SYMBOL(lg_local_unlock_cpu);
51 void lg_global_lock_online(struct lglock *lg)
55 rwlock_acquire(&lg->lock_dep_map, 0, 0, _RET_IP_);
56 for_each_online_cpu(i) {
57 arch_spinlock_t *lock;
58 lock = per_cpu_ptr(lg->lock, i);
62 EXPORT_SYMBOL(lg_global_lock_online);
64 void lg_global_unlock_online(struct lglock *lg)
67 rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
68 for_each_online_cpu(i) {
69 arch_spinlock_t *lock;
70 lock = per_cpu_ptr(lg->lock, i);
71 arch_spin_unlock(lock);
75 EXPORT_SYMBOL(lg_global_unlock_online);
77 void lg_global_lock(struct lglock *lg)
81 rwlock_acquire(&lg->lock_dep_map, 0, 0, _RET_IP_);
82 for_each_possible_cpu(i) {
83 arch_spinlock_t *lock;
84 lock = per_cpu_ptr(lg->lock, i);
88 EXPORT_SYMBOL(lg_global_lock);
90 void lg_global_unlock(struct lglock *lg)
93 rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
94 for_each_possible_cpu(i) {
95 arch_spinlock_t *lock;
96 lock = per_cpu_ptr(lg->lock, i);
97 arch_spin_unlock(lock);
101 EXPORT_SYMBOL(lg_global_unlock);