gpt4 book ai didi

linux - 为什么来自中断处理程序的预定 tasklet 不运行

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:24 27 4
gpt4 key购买 nike

我有一个中断处理程序,它按如下方式安排一个 tasklet(伪代码)-

struct tasklet_struct mytasklet;

void my_tasklet_function(unsigned long arg1) {
...
pr_alert("Inside tasklet function\n");
...
}

int my_probe() {
....
....
tasklet_init(&mytasklet, my_tasklet_function, arg1);
....
/* Register interrupt handler my_irq_handler*/
....
}

irqreturn_t my_irq_handler(int irq, void *data) {
...
status = read_reg(base_addr, intr_status_reg_offset)
write_reg(base_addr, intr_status_reg_offset, status);

if (status & INTR_MASK_1) {
....
pr_alert("intr 1 came\n");
}
...
...
pr_alert("Schedule tasklet\n");
tasklet_schedule(&mytasklet);
pr_alert("Exit irq\n");

return IRQ_HANDLED;
}

观察到打印如下后内核挂了

intr 1 came
Schedule tasklet

“Exit irq”打印永远不会出现。 tasklet函数中的打印没有打印出来。

  • 这个 tasklet 没有被调度的原因是什么?

  • 什么可能导致内核挂起?

最佳答案

tasklet 调度不应在 IRQ 处理程序中完成。你可以查看 lxr 中的 schedule_tasklet() 代码。在 IRQ 处理程序中,调用 schedule_tasklet() 仅设置软中断位,并链接您的 tasklet。

当 irq_exit() 被调用时,它会检查它是否仍在中断上下文中(嵌套中断)。如果没有,并且有任何启用的 tasklet,它将调用 softirq 处理程序,后者又将调用 tasklet。

关于linux - 为什么来自中断处理程序的预定 tasklet 不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40427786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com