summaryrefslogtreecommitdiffstats
path: root/kernel/locking/lglock.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/locking/lglock.c')
-rw-r--r--kernel/locking/lglock.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/kernel/locking/lglock.c b/kernel/locking/lglock.c
index 86ae2aebf004..951cfcd10b4a 100644
--- a/kernel/locking/lglock.c
+++ b/kernel/locking/lglock.c
@@ -60,6 +60,28 @@ void lg_local_unlock_cpu(struct lglock *lg, int cpu)
60} 60}
61EXPORT_SYMBOL(lg_local_unlock_cpu); 61EXPORT_SYMBOL(lg_local_unlock_cpu);
62 62
63void lg_double_lock(struct lglock *lg, int cpu1, int cpu2)
64{
65 BUG_ON(cpu1 == cpu2);
66
67 /* lock in cpu order, just like lg_global_lock */
68 if (cpu2 < cpu1)
69 swap(cpu1, cpu2);
70
71 preempt_disable();
72 lock_acquire_shared(&lg->lock_dep_map, 0, 0, NULL, _RET_IP_);
73 arch_spin_lock(per_cpu_ptr(lg->lock, cpu1));
74 arch_spin_lock(per_cpu_ptr(lg->lock, cpu2));
75}
76
77void lg_double_unlock(struct lglock *lg, int cpu1, int cpu2)
78{
79 lock_release(&lg->lock_dep_map, 1, _RET_IP_);
80 arch_spin_unlock(per_cpu_ptr(lg->lock, cpu1));
81 arch_spin_unlock(per_cpu_ptr(lg->lock, cpu2));
82 preempt_enable();
83}
84
63void lg_global_lock(struct lglock *lg) 85void lg_global_lock(struct lglock *lg)
64{ 86{
65 int i; 87 int i;