一.重要数据结构

1.irq_desc

内核中记录一个irq_desc的数组,数组的每一项对应一个中断或者一组中断(使用同一中断号)。一句话,irq_desc几乎记录所有中断相关的东西,这个结构是中断的核心。其中包括两个重要的数据结构irq_chip和irqaction。

include/linux/irq.h

struct irq_desc irq_desc[NR_IRQS];

/**

 * struct irq_desc - interrupt descriptor

 * @irq:        interrupt number for this descriptor

 * @timer_rand_state:   pointer to timer rand state struct

 * @kstat_irqs:     irq stats per cpu

 * @irq_2_iommu:    iommu with this irq

 * @handle_irq:     highlevel irq-events handler [if NULL, __do_IRQ()]

 * @chip:       low level interrupt hardware access

 * @msi_desc:       MSI descriptor

 * @handler_data:   per-IRQ data for the irq_chip methods

 * @chip_data:      platform-specific per-chip private data for the chip

 *          methods, to allow shared chip implementations

 * @action:     the irq action chain

 * @status:     status information

 * @depth:      disable-depth, for nested irq_disable() calls

 * @wake_depth:     enable depth, for multiple set_irq_wake() callers

 * @irq_count:      stats field to detect stalled irqs

 * @last_unhandled: aging timer for unhandled count

 * @irqs_unhandled: stats field for spurious unhandled interrupts

 * @lock:       locking for SMP

 * @affinity:       IRQ affinity on SMP     //affinity 密切关系,姻亲关系

 * @cpu:        cpu index useful for balancing

 * @pending_mask:   pending rebalanced interrupts

 * @threads_active: number of irqaction threads currently running

 * @wait_for_threads:   wait queue for sync_irq to wait for threaded handlers

 * @dir:        /proc/irq/ procfs entry

 * @name:       flow handler name for /proc/interrupts output

 */

struct irq_desc {

    unsigned int        irq;

    struct timer_rand_state *timer_rand_state;

    unsigned int            *kstat_irqs;

#ifdef CONFIG_INTR_REMAP

    struct irq_2_iommu      *irq_2_iommu;

#endif

    irq_flow_handler_t  handle_irq;

    struct irq_chip     *chip;

    struct msi_desc     *msi_desc;

    void            *handler_data;

    void            *chip_data;

    struct irqaction    *action;    /* IRQ action list */

    unsigned int        status;     /* IRQ status */

 

    unsigned int        depth;      /* nested irq disables */

    unsigned int        wake_depth; /* nested wake enables */

    unsigned int        irq_count;  /* For detecting broken IRQs */

    unsigned long       last_unhandled; /* Aging timer for unhandled count */

    unsigned int        irqs_unhandled;

    spinlock_t      lock;

#ifdef CONFIG_SMP

    cpumask_var_t       affinity;

    unsigned int        cpu;

#ifdef CONFIG_GENERIC_PENDING_IRQ

    cpumask_var_t       pending_mask;

#endif

#endif

    atomic_t        threads_active;

    wait_queue_head_t       wait_for_threads;

#ifdef CONFIG_PROC_FS

    struct proc_dir_entry   *dir;

#endif

    const char      *name;

} ____cacheline_internodealigned_in_smp;
struct irq_desc irq_desc[NR_IRQS]

相关文章: