- 论坛徽章:
- 0
|
SLES 12,kernel 3.12.28
一台比较闲的HP服务器极偶然看到的(仅一次)
dmesg: do_IRQ: 1.105 No irq handler for vector (irq -1)
看了一下代码:
- __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
- {
- struct pt_regs *old_regs = set_irq_regs(regs);
- /* high bit used in ret_from_ code */
- unsigned vector = ~regs->orig_ax;
- unsigned irq;
- irq_enter();
- exit_idle();
- irq = __this_cpu_read(vector_irq[vector]);
- if (!handle_irq(irq, regs)) {
- ack_APIC_irq();
- if (irq != VECTOR_RETRIGGERED) {
- pr_emerg_ratelimited("%s: %d.%d No irq handler for vector (irq %d)\n",
- __func__, smp_processor_id(),
- vector, irq);
- } else {
- __this_cpu_write(vector_irq[vector], VECTOR_UNDEFINED);
- }
- }
- irq_exit();
- set_irq_regs(old_regs);
- return 1;
- }
复制代码 意思是cpu 1 收到了一个irq为-1,中断向量为105的中断,但没有handler。 irq竟然为-1,也就是cpu 1 上的vector_irq[105]为-1。追溯了一下分配irq的api,根本不可能获得一个复数的irq。所以觉得应该是某个设备驱动没有使用内核api分配了一个irq,在检查返回值前又分配了一个vector。然后检查了irq返回值发现有问题,也就没有继续往下注册irq handler了。 |
|