Linux kernel 如何确保我的内核配置为使用线程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 *

我正在尝试在4.11 Linux内核的平台驱动程序代码中使用线程中断。我目前正面临随机的内核崩溃。在调试问题时,我如何确保我的内核实际上已经准备好处理线程化IRQ。为了安装中断处理程序,我使用了devm\u request\u threaded\u irq()。是否有要检查是否已应用的修补程序列表和/或要检查内核配置的配置选项列表

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可能线程处理函数没有得到要计划的更改。所以问题是为什么?这本书似乎暗示线程中断是抢占补丁的一部分。这是对的还是我错了