Interrupts
- Interrupts and exceptions (x86)
- Interrupts and exceptions (Linux)
- Deferrable work
- Timers
- cli (CLear Interrupt flag)
- sti (SeT Interrupt flag)
CPU checks the current privilege level
if need to change privilege level
- change stack with the one associated with new privilege
- save old stack information on the new stack
save EFLAGS, CS, EIP on stack
save error code on stack in case of an abort
execute the kernel interrupt handler
- it runs as a result of an IRQ (not of an exception)
- there is no well defined process context associated
- not allowed to trigger a context switch (no sleep, schedule, or user memory access)
- softIRQ
- runs in interrupt context
- statically allocated
- same handler may run in parallel on multiple cores
- tasklet
- runs in interrupt context
- can be dynamically allocated
- same handler runs are serialized
- workqueues
- run in process context
Soft IRQ APIs:
- initialize:
open_softirq()
- activation:
raise_softirq()
- masking:
local_bh_disable()
,local_bh_enable()
Once activated, the callback function
do_softirq()
runs either:
- after an interrupt handler or
- from the ksoftirqd kernel thread
- minimum priority kernel thread
- runs softirqs after certain limits are reached
- tries to achieve good latency and avoid process starvation
- HI_SOFTIRQ
- TIMER_SOFTIRQ
- NET_TX_SOFTIRQ
- NET_RX_SOFTIRQ
- BLOCK_SOFTIRQ
- IRQ_POLL_SOFTIRQ
- TASKLET_SOFTIRQ
- SCHED_SOFTIRQ
- HRTIMER_SOFTIRQ,
- RCU_SOFTIRQ
Tasklets are a dynamic type (not limited to a fixed number) of deferred work running in interrupt context.
Tasklets API:
- initialization:
tasklet_init()
- activation:
tasklet_schedule()
- masking:
tasklet_disable()
,tasklet_enable()
Tasklets are implemented on top of two dedicated softirqs:
TASKLET_SOFITIRQ
and HI_SOFTIRQ
Tasklets are also serialized, i.e. the same tasklet can only execute on one processor.
Workqueues are a type of deferred work that runs in process context.
They are implemented on top of kernel threads.
Workqueues API:
- init:
INIT_WORK
- activation:
schedule_work()
Timers are implemented on top of the
TIMER_SOFTIRQ
Timer API:
- initialization:
setup_timer()
- activation:
mod_timer()