UP下: #define spin_lock(x) (void)lock #define spin_unlock(x) do {} while(0) 可见,spin_lock(x)和spin_unlock(x)在UP环境下什么都不做。 SMP下: void spin_lock(spinlock_t *plock)的执行过程如下:如果plock->lock=1,说明已被锁住,则 CPU 就不能去使用它所保护的资料结构;如果plock->lock=1,说明已被锁住,则可以从spin_lock()传回,接下去使用它所保护的资 料。
spin_lock_irqsave()在UP和SMP的不同:
#define spin_lock_irqsave(lock,flags) do { local_irq_save(flags); spin_lock(lock); } while (0) 可见在UP和SMP下,spin_lock_irqsave()的代码是一样的,但是由于“在UP和SMP下,spin_lock(lock)函数的实现不同”,导致了“在UP和SMP下,spin_lock_irqsave()函数的实现不同”。 local_irq_save(flags) 做的事就是将 CPU 的 flag 值先储存到 flags 变数里,然后将 CPU 的中断 diable 掉。这里将 CPU 的中断 disable 是指将执行这段 code 的 CPU,并不是指全部的 CPU。 也就是说它只会 disable local CPU 的中断。local_irq_save(flags)保证了本地cpu(执行这段code的cpu)不会打断临界区代码的执行;spin_lock()则 保证了其他的cpu不会打断临界代码的执行。
举例:
spinlock t xxx lock = SPIN_LOCK_UNLOCKED; unsigned long flags;