自旋锁是类似于信号量的,同样是对设备的访问进行干预,自旋锁是一个互斥的,只能是上锁后设备不可用,解锁后可用。当某一个设备被自旋锁锁定时,其他的进程需要访问设备时会进入一个忙循环的等待状态,知道设备的自旋锁释放后方可对设备进行访问。
在自旋锁锁住设备进行操作时,这些个操作一般都是比较简单,费时少,而且做到不要休眠,拥有自旋锁时禁止当前所用处理器上的CPU的中断。
具体用法是
1.包含
Spinlock.h (include\linux)
2.初始化spinlock,当然你得先定义一个自旋锁,
spinlock_t lock
#define spin_lock_init(_lock) \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
3.上锁
spin_lock_irqsave(lock, flags),其中flags是你定义的一个变量,这个函数会关闭当前处理器上(单核)所有的中断
#define spin_lock_irqsave(lock, flags) \
do { \
raw_spin_lock_irqsave(spinlock_check(lock), flags); \
} while (0)
4.解锁
spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
<span style="white-space:pre"> </span>raw_spin_unlock_irqrestore(&lock->rlock, flags);
}
这个是一般的用法,
当然在tasklet中,需要我们将 spin_lock_irqsave(lock, flags),替换成spin_unlock_bh(spinlock_t *lock),以及解锁用spin_unlock_bh(&gact->tcf_lock);