Interrupts

Interrupts

Exceptions

Hardware (PIC)

../_images/ditaa-5db1739b80a83b12505e4ff749b5e69fccd01f1b.png

Hardware (APIC)

../_images/ditaa-9d23d02ebdff6eeb6bec8044480f055de9852ecc.png

Enabling/disabling the interrupts

  • cli (CLear Interrupt flag)
  • sti (SeT Interrupt flag)

Interrupt Descriptor Table

Linux IRQ vector layout

../_images/ditaa-5b3c93f6e612d0cc0e4d4837d92a443627405262.png

Interrupt descriptor table entry (gate)

../_images/ditaa-eff5e0e3b58ce239d5310b22b89c0927be5853bd.png

Interrupt handler address

../_images/ditaa-b2023fce22479e20bbe08fd76eed87e9a0527688.png

Interrupt handler stack

../_images/ditaa-85b69602726fa6143fc3ba0ffdb492454864aacf.png

Handling an interrupt request

Returning from an interrupt

Interrupt handling in Linux

../_images/ditaa-da31e3d17a4d55e5c3dbc0bd5903306418a896ca.png

IRQ nesting in Linux

Interrupt/Exception nesting

../_images/ditaa-cf9d88cddb9129693d8858ceb52726cc5d6cd391.png

Interrupt context

  • 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)

Deferrable actions in Linux

  • 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 IRQs

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

ksoftirqd

  • minimum priority kernel thread
  • runs softirqs after certain limits are reached
  • tries to achieve good latency and avoid process starvation

Types of soft IRQ

  • HI_SOFTIRQ
  • TIMER_SOFTIRQ
  • NET_TX_SOFTIRQ
  • NET_RX_SOFTIRQ
  • BLOCK_SOFTIRQ
  • IRQ_POLL_SOFTIRQ
  • TASKLET_SOFTIRQ
  • SCHED_SOFTIRQ
  • HRTIMER_SOFTIRQ,
  • RCU_SOFTIRQ

Tasklets

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

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

Timers are implemented on top of the TIMER_SOFTIRQ

Timer API:

  • initialization: setup_timer()
  • activation: mod_timer()