RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。
The following table lists the minimum locking requirements between various contexts. In some cases, the same context can only be running on one CPU at a time, so no locking is required for that context (eg. a particular thread can only run on one CPU at a time, but if it needs shares data with another thread, locking is required).
Remember the advice above: you can always use spin_lock_irqsave(), which is a superset of all other spinlock primitives.
| IRQ Handler A | IRQ Handler B | Softirq A | Softirq B | Tasklet A | Tasklet B | Timer A | Timer B | User Context A | User Context B | |
| IRQ Handler A | None | |||||||||
| IRQ Handler B | spin_lock_irqsave | None | ||||||||
| Softirq A | spin_lock_irq | spin_lock_irq | spin_lock | |||||||
| Softirq B | spin_lock_irq | spin_lock_irq | spin_lock | spin_lock | ||||||
| Tasklet A | spin_lock_irq | spin_lock_irq | spin_lock | spin_lock | None | |||||
| Tasklet B | spin_lock_irq | spin_lock_irq | spin_lock | spin_lock | spin_lock | None | ||||
| Timer A | spin_lock_irq | spin_lock_irq | spin_lock | spin_lock | spin_lock | spin_lock | None | |||
| Timer B | spin_lock_irq | spin_lock_irq | spin_lock | spin_lock | spin_lock | spin_lock | spin_lock | None | ||
| User Context A | spin_lock_irq | spin_lock_irq | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | None | |
| User Context B | spin_lock_irq | spin_lock_irq | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | spin_lock_bh | down_interruptible | None |