Linux kernel 如何确保我的内核配置为使用线程IRQ?
我正在尝试在4.11 Linux内核的平台驱动程序代码中使用线程中断。我目前正面临随机的内核崩溃。在调试问题时,我如何确保我的内核实际上已经准备好处理线程化IRQ。为了安装中断处理程序,我使用了devm\u request\u threaded\u irq()。是否有要检查是否已应用的修补程序列表和/或要检查内核配置的配置选项列表Linux kernel 如何确保我的内核配置为使用线程IRQ?,linux-kernel,linux-device-driver,interrupt-handling,Linux Kernel,Linux Device Driver,Interrupt Handling,我正在尝试在4.11 Linux内核的平台驱动程序代码中使用线程中断。我目前正面临随机的内核崩溃。在调试问题时,我如何确保我的内核实际上已经准备好处理线程化IRQ。为了安装中断处理程序,我使用了devm\u request\u threaded\u irq()。是否有要检查是否已应用的修补程序列表和/或要检查内核配置的配置选项列表 ret = devm_request_threaded_irq(dev, data->irq, /* irq number *
ret = devm_request_threaded_irq(dev,
data->irq, /* irq number */
&abc_handle_irq, /* top half handler */
&abc_thread_irq, /* threaded bottom half */
IRQF_SHARED,
DEVICE_NAME,
(void *)pdev);
if (ret) {
dev_err(dev, "devm_request_threaded_irq() failed: %d\n", ret);
goto error;
}
/* Top Half */
irqreturn_t abc_handle_irq(struct device *dev)
{
struct xxx_dev *xxx = dev_get_drvdata(dev);
int ret = IRQ_HANDLED;
u32 int_status;
if (!xxx)
return IRQ_NONE;
...
...
int_status = ioread32(xxx->reg_base + xxx_INTERRUPT_STATUS);
if(/* int_status indicates error */) {
/* ERROR case */
dev_info(dev, "%s: Got ERROR!\n", __func__);
/* clear the interrupt */
}
if (/* int_status has PICTURE_DONE_IRQ bit set */) {
/* clear the interrupt */
....
ret = IRQ_WAKE_THREAD;
} else
return IRQ_NONE; /* spurious interrupt not interested */
return ret;
}
/* Bottom Half */
irqreturn_t xxx_thread_irq(struct device *dev)
{
struct xxx_dev *xxx = dev_get_drvdata(dev);
irqreturn_t ret = IRQ_HANDLED;
if (!xxx)
return IRQ_NONE;
dev_info(dev, "%s: IRQ\n", __func__);
mutex_lock(&xxx->lock); /* lock is shared between the bottom half and a process context */
/* Spurious interrupt */
if (unlikely(!xxx->cmd)) {
dev_err(dev, "%s: No pending encode\n", __func__);
ret = IRQ_NONE;
goto out_unlock;
}
xxx_yyy_command_completed(abc, pqr, 0);
kfree(xxx->cmd);
xxx->cmd = NULL;
out_unlock:
mutex_unlock(&xxx->lock);
dev_info(dev, "%s: exiting\n", __func__);
return ret;
}
/*内核崩溃*/
[ 63.327733] ---[ end trace f1f2a7c1833acf6b ]---
[ 63.327787] CPU: 1 PID: 156 Comm: irq/18-abc-xxx Tainted: G W O 4.11.0 #6
[ 63.327844] task: a80000804f31e680 task.stack: a800008045f7c000
[ 63.327886] $ 0 : 0000000000000000 ffffffff80192a30 ffffffffc001f794 0000000000040b00
[ 63.327974] $ 4 : 0000000000000012 a80000804f282400 000000001400fde0 ffffffffffff00fe
[ 63.328062] $ 8 : fffffffffffffffc a8000000814d0000 0000000000000000 00000000000007ff
[ 63.328150] $12 : a800008045f7fdd8 000000000000fd00 0000000000000000 0000000000000000
[ 63.328237] $16 : a80000804f991380 ffffffff80192608 a80000804f268a00 a80000804f9913c0
[ 63.328326] $20 : ffffffff80190000 ffffffff808c3440 ffffffff808d0000 0000000000000001
[ 63.328415] $24 : 0000000000000000 ffffffff80254440
[ 63.328501] $28 : a800008045f7c000 a800008045f7fdc0 ffffffff808c3440 ffffffff80192640
[ 63.328592] Hi : a80000804f9913c0
[ 63.328625] Lo : ffffffff80190000
[ 63.328691] epc : ffffffffc001f794 xxx_thread_irq+0x0/0x24 [jsp]
[ 63.328747] ra : ffffffff80192640 irq_thread_fn+0x38/0x64
[ 63.328789] Status: 1400fde3 KX SX UX KERNEL EXL IE
[ 63.328868] Cause : 00800400 (ExcCode 00)
[ 63.328904] PrId : 0001a900 (MIPS I6400)
[ 63.328950] CPU: 1 PID: 156 Comm: irq/18-aaa-xxx Tainted: G W O 4.11.0 #6
[ 63.328999] Stack : 0000000000000049 0000000000000049 ffffffff814841da 0000000000000000
[ 63.329085] ffffffff808d0000 0000000000000049 0000000000000049 ffffffff8018de40
[ 63.329172] 0000000000000000 ffffffff8018e61c ffffffff808c0000 0000000000000000
[ 63.329258] ffffffff808c0000 ffffffff807aa838 a80000804f31e680 ffffffff8147e5b0
[ 63.329346] 000000000000009c 0000000000000001 a80000804f09be7c ffffffff808d0000
[ 63.329432] ffffffff808cc080 ffffffff8018c54c a80000804f09bd20 0000000000040b00
[ 63.329520] ffffffff808c9b87 ffffffff8018f598 0000000000010000 ffffffff807aa838
[ 63.329607] 0000000000000001 000000000000009c a80000804f09bc48 0000000000000000
[ 63.329693] ffffffff804a888c 000000001400fde0 0000000000000000 0000000000000000
[ 63.329779] 0000000000000000 0000000000000000 ffffffff8010e96c 0000000000040b00
[ 63.329865] ...
[ 63.329903] Call Trace:
[ 63.329941] [<ffffffff8010e96c>] show_stack+0x68/0xbc
[ 63.329994] [<ffffffff804a888c>] dump_stack+0xdc/0x110
[ 63.330055] [<ffffffff801be074>] flush_smp_call_function_queue+0x12c/0x1fc
[ 63.330119] [<ffffffff80113a44>] ipi_call_interrupt+0x18/0x28
[ 63.330177] [<ffffffff80190f9c>] __handle_irq_event_percpu+0xa8/0x25c
[ 63.330238] [<ffffffff8019118c>] handle_irq_event_percpu+0x3c/0x98
[ 63.330297] [<ffffffff80191240>] handle_irq_event+0x58/0x90
[ 63.330355] [<ffffffff80195fc0>] handle_edge_irq+0x168/0x1a4
[ 63.330411] [<ffffffff8018feb4>] generic_handle_irq+0x2c/0x3c
[ 63.330472] [<ffffffff804e8c74>] gic_irq_dispatch+0x220/0x274
[ 63.330528] [<ffffffff8018feb4>] generic_handle_irq+0x2c/0x3c
[ 63.330586] [<ffffffff80736a94>] do_IRQ+0x24/0x30
[ 63.330642] [<ffffffff804e4f3c>] plat_irq_dispatch+0xf4/0x128
[ 63.330697] [<ffffffff80101234>] handle_int+0x134/0x140
[ 63.330771] [<ffffffffc001f794>] xxx_thread_irq+0x0/0x24 [jsp]
[ 63.330850] [<ffffffff80192640>] irq_thread_fn+0x38/0x64
[ 63.330906] [<ffffffff80192a30>] irq_thread+0x144/0x27c
[ 63.330961] [<ffffffff8015d368>] kthread+0x180/0x188
[ 63.331014] [<ffffffff80100ed4>] ret_from_kernel_thread+0x14/0x1c
[63.327733]--[end trace f1f2a7c1833acf6b]---
[63.327787]CPU:1 PID:156通信:irq/18 abc xxx污染:G W O 4.11.0#6
[63.327844]任务:a80000804f31e680任务。堆栈:a800008045f7c000
[63.327886]$0:0000000000000000 FFFFFFFF 80192A30 FFFFFFFF C001F7940000000000040B00
[63.327974]$4:00000000000000 12 A80000804F282400000000000 14000FDE0 FFFFFFFF00FE
[63.328062]$8:FFFFFFFFFFFFFFFFFFC A800000814D0000000000000000000000000000000000007FF
[63.328150]$12:a800008045f7fdd8 0000000000000000000000000000000000000000000000000000000000000000000000000000
[63.328237]$16:a80000804f991380 FFFFFF80192608 a80000804f268a00 a80000804f9913c0
[63.328326]$20:ffffffff80190000 FFFFFFFFFF808C3440FFFFFFFF808D0000 00000000000001
[63.328415]$24:0000000000000000 FFFFFFFF8025440
[63.328501]$28:a800008045f7c000 a800008045f7fdc0 FFFFFFFF 808C3440 FFFFFFFF 80192640
[63.328592]嗨:a80000804f9913c0
[63.328625]Lo:FFFFFFFF8019000
[63.328691]epc:ffffffffc001f794 xxx_thread_irq+0x0/0x24[jsp]
[63.328747]ra:ffffffffff80192640 irq_螺纹螺纹fn+0x38/0x64
[63.328789]状态:1400fde3 KX SX UX内核EXL IE
[63.328868]原因:00800400(EXC000代码)
[63.328904]PrId:0001a900(MIPS I6400)
[63.328950]CPU:1 PID:156通信:irq/18 aaa xxx污染:G W O 4.11.0#6
[63.328999]堆栈:00000000000000 49 00000000000000 49 ffffffff814841da 0000000000000000
[63.329085]FFFFFF808D0000 00000000000000 49 00000000000000 49 ffffffff8018de40
[63.329172]0000000000000000 FFFFFFFF 8018E61C FFFFFFFF 808C0000 0000000000000000
[63.329258]FFFFFF808C0000 FFFFFF807AA838 a80000804f31e680 ffffffff8147e5b0
[63.329346]00000000000000 9C 000000000000000 1 a80000804f09be7c FFFFFF 808D0000
[63.329432]ffffffff808cc080 ffffffff8018c54c a80000804f09bd20 0000000000040b00
[63.329520]FFFFFF 808C9B87 FFFFFFFF 8018F598 00000000000 10000 FFFFFFFF 807AA838
[63.329607]000000000000000 1 00000000000000 9C a80000804f09bc48 0000000000000000
[63.329693]ffffffff804a888c 00000000 1400FDE00000000000000000000000000000
[63.329779]000000000000000000000000000000000000000000 FFFFFF 8010E96C 0000000000040b00
[ 63.329865] ...
[63.329903]呼叫跟踪:
[63.329941][]显示堆栈+0x68/0xbc
[63.329994][]转储堆栈+0xdc/0x110
[63.330055][]刷新smp调用功能队列+0x12c/0x1fc
[63.330119][]ipi调用中断+0x18/0x28
[63.330177][]处理irq事件percpu+0xa8/0x25c
[63.330238][]处理irq事件percpu+0x3c/0x98
[63.330297][]处理irq事件+0x58/0x90
[63.330355][]手柄边缘irq+0x168/0x1a4
[63.330411][]通用句柄irq+0x2c/0x3c
[63.330472][]gic_irq_调度+0x220/0x274
[63.330528][]通用句柄irq+0x2c/0x3c
[63.330586][]执行IRQ+0x24/0x30
[63.330642][]平台irq调度+0xf4/0x128
[63.330697][]句柄int+0x134/0x140
[63.330771][]xxx_thread_irq+0x0/0x24[jsp]
[63.330850][]irq_线程_fn+0x38/0x64
[63.330906][]irq_螺纹+0x144/0x27c
[63.330961][]kthread+0x180/0x188
[63.331014][]从内核线程返回+0x14/0x1c
例如,我需要配置PREEMPT=y和PREEMPT\u RT=y来使用线程化IRQ。任何线索都会有帮助。我在我的内核配置中设置了以下内容:config_PREEMPT_自愿=y,但未设置#config_PREEMPT_NONE未设置#config_PREEMPT未设置或PREEMPT_RTCONFIG_PREEMPT用于启用/禁用抢占。好的,首先,日志在哪里?您是否检查了devm_request_threaded_irq()的返回值?你在那里看到错误代码了吗?如果是,您是否验证了代码。如果可能的话,为什么不显示您的模块代码?@LinuxStuff感谢您的回复。不,我在devm\u请求\u线程化\u irq()中没有收到任何错误。但是在接收到中断后,中断处理程序IRQ_WAKE_线程将返回内核。然后内核应该调用线程函数。但是线程函数间歇性地没有被调用。@LinuxStuff可能线程处理函数没有得到要计划的更改。所以问题是为什么?这本书似乎暗示线程中断是抢占补丁的一部分。这是对的还是我弄错了?我了解标准的中断处理,但以前从未使用/调试过线程中断处理程序。例如,我需要CONFIG_PREEMPT=y和PREEMPT_RT=y来使用线程IRQ。任何线索都会有帮助。我在我的内核配置中设置了以下内容:config_PREEMPT_自愿=y,但未设置#config_PREEMPT_NONE未设置#config_PREEMPT未设置或PREEMPT_RTCONFIG_PREEMPT用于启用/禁用抢占。好的,首先,日志在哪里?您是否检查了devm_request_threaded_irq()的返回值?你在那里看到错误代码了吗?如果是,您是否验证了代码。如果可能的话,为什么不显示您的模块代码?@LinuxStuff感谢您的回复。不,我在devm\u请求\u线程化\u irq()中没有收到任何错误。但是在接收到中断后,中断处理程序IRQ_WAKE_线程将返回内核。然后内核应该调用线程函数。但是线程函数间歇性地没有被调用。@LinuxStuff可能线程处理函数没有得到要计划的更改。所以问题是为什么?这本书似乎暗示线程中断是抢占补丁的一部分。这是对的还是我错了