User Tools

Site Tools


mywiki:linux:linux_kernel_notes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
mywiki:linux:linux_kernel_notes [2015/04/15 15:02] – [Kernel Context knowledge] 180.87.185.80mywiki:linux:linux_kernel_notes [2019/09/15 18:55] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Spin Lock ====== +| [[http://www.linux-mips.org/wiki/Linux/MIPS_Porting_Guide|MIPS Porting Guide]] |
- +
- +
-===== Table of Minimum Spin Lock Requirements ===== +
- +
- +
-The following table lists the minimum locking requirements between various contextsIn some cases, the same context can only be running on one CPU at a time, so no locking is required for that context (ega 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 =====  ===== Kernel Context knowledge ===== 
 | process context | includes user context, kernel thread, work queue | | 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. | | 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 (not kernel) | A process executing its own code outside the kernel | 
-Userspace | A process executing its own code outside the kernel | +| Interrupt context | includes hard irq, kernel timer, softirq, tasklet | if in_interrupt() true | 
-| Hardware Interrupt / Hardware IRQ | Hardware interrupt request | if in_irq() true | +| Hardware IRQ | Hardware interrupt request | if in_irq() true | 
-Software Interrupt / softirq | Software interrupt handler. in_irq() returns false; in_softirq() returns true. Tasklets and softirqs both fall into the category of 'software interrupts'. Strictly speaking a softirq is one of up to 32 enumerated software interrupts which can run on multiple CPUs at once. Sometimes used to refer to tasklets as well (ie. all software interrupts). \\ +Softirq | Software interrupt handler. in_irq() returns false; in_softirq() returns true. Tasklets and softirqs both fall into the category of 'software interrupts'. Strictly speaking a softirq is one of up to 32 enumerated software interrupts which can run on multiple CPUs at once. Sometimes used to refer to tasklets as well (ie. all software interrupts). | if in_irq() false and in_softirq() true |
- | 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 | | 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). | | 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)