~linux/Documentation/spinlocks.txt
多核心處理 critical section 的方式,safe but slow(disable interrupts)
67 See
68
69 spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
70
71
72 unsigned long flags;
73
74 spin_lock_irqsave(&xxx_lock, flags);
75 ... critical section here ..
76 spin_unlock_irqrestore(&xxx_lock, flags);
單核心處理 critical section 的方式:
115
116 spin_lock_irqsave(flags);
117 .. critical section ..
118 spin_unlock_irqrestore(flags);
119
reader/writer 處理 shared data 的鎖定方式:
149 rwlock_t xxx_lock = RW_LOCK_UNLOCKED;
150
151
152 unsigned long flags;
153
154 read_lock_irqsave(&xxx_lock, flags);
155 .. critical section that only reads the info ...
156 read_unlock_irqrestore(&xxx_lock, flags);
157
158 write_lock_irqsave(&xxx_lock, flags);
159 .. read and write exclusive access to the info ...
160 write_unlock_irqrestore(&xxx_lock, flags);
如果確定不會跑在 interrupt handler 中(否則會重複鎖定造成 dead lock),
可以用簡化的 spin_lock API 較快
192 spin_lock(&lock);
193 ...
194 spin_unlock(&lock);
因此 read lock 等可以用簡化的非 irq safe spinlock,但 write lock 則必須
使用 irq safe 的 spin lock