mywiki:linux:linux_kernel_notes
This is an old revision of the document!
Table of Contents
Spin Lock
Table of Minimum Spin Lock Requirements
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 |
Kernel Context knowledge
| process context | includes user context, kernel thread, work queue | |
| User Context | The kernel executing on behalf of a particular process (ie. a system call or trap, ioctl, module_init, module_exit or kernel thread, workqueue. You can tell which process with the current macro.) Not to be confused with userspace. Can be interrupted by software or hardware interrupts. | |
| Interrupt context | includes kernel timer, softirq, hard irq, tasklet | if in_interrupt() true |
| Userspace | A process executing its own code outside the kernel | |
| Hardware Interrupt / Hardware IRQ | Hardware interrupt request | if in_irq() true |
| Software Interrupt / softirq |
| if in_irq() false and in_softirq() true |
| Tasklet | A dynamically-registered software interrupt, which is guaranteed to only run on one CPU at a time |
| Timer | which is running at (or close to) a given time. When running, it is just like a tasklet (in fact, they are called from the TIMER_SOFTIRQ). |
mywiki/linux/linux_kernel_notes.1429081373.txt.gz · Last modified: (external edit)
