* The MHI interrupt handling issue @ 2020-12-07 13:20 Loic Poulain 2020-12-07 15:48 ` Jeffrey Hugo 0 siblings, 1 reply; 4+ messages in thread From: Loic Poulain @ 2020-12-07 13:20 UTC (permalink / raw) To: Manivannan Sadhasivam, Hemant Kumar, Bhaumik Bhatt, Jeffrey Hugo Cc: linux-arm-msm Hi folks, Before putting my hands into that, I wanted to expose a MHI interrupt problem, comments are welcome. Currently, the hard IRQ handler for event rings do nothing except triggering a tasklet as bottom half that in turn will take care of retrieving buffer(s). That leads to have an unexpected high amount of interrupts when I perform throughput testing with mhi-net (though it applies for any mhi client driver). The point is that usually, an hard interrupt handler is responsible for triggering the bottom half handler but also for clearing/suspending interrupt on device side. However, AFAIK, there is no such possibility in the MHI protocol. Since the interrupt is not handled in the hard irq handler, it is triggered again once interrupt are re-enabled, and even during the tasklet execution... at the end, that makes a lot of unnecessary interrupts, that introduce latency and participate to system load... I added some printk to highlight that issue: [11564.689202] mhi_irq_handler 55d32b8 [11564.689485] mhi_irq_handler 55d32b8 [11564.690011] mhi_irq_handler 55d32b8 [11564.690397] [55d32b8] mhi_process_data_event_ring start [11564.690667] mhi_irq_handler 55d32b8 [11564.690937] mhi_irq_handler 55d32b8 [11564.691207] mhi_irq_handler 55d32b8 [11564.691475] mhi_irq_handler 55d32b8 [11564.692076] [55d32b8] mhi_process_data_event_ring done [...] I see two solutions to fix that problem: - Manage events directly in the hard-irq handler (no more tasklet) - Use threaded IRQ with IRQF_ONESHOT flag, to keep interrupt masked until threaded handler has completed. Regards, Loic ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: The MHI interrupt handling issue 2020-12-07 13:20 The MHI interrupt handling issue Loic Poulain @ 2020-12-07 15:48 ` Jeffrey Hugo 2020-12-07 17:02 ` Loic Poulain 0 siblings, 1 reply; 4+ messages in thread From: Jeffrey Hugo @ 2020-12-07 15:48 UTC (permalink / raw) To: Loic Poulain, Manivannan Sadhasivam, Hemant Kumar, Bhaumik Bhatt Cc: linux-arm-msm On 12/7/2020 6:20 AM, Loic Poulain wrote: > Hi folks, > > Before putting my hands into that, I wanted to expose a MHI interrupt > problem, comments are welcome. > > Currently, the hard IRQ handler for event rings do nothing except > triggering a tasklet as bottom half that in turn will take care of > retrieving buffer(s). That leads to have an unexpected high amount of > interrupts when I perform throughput testing with mhi-net (though it > applies for any mhi client driver). > > The point is that usually, an hard interrupt handler is responsible > for triggering the bottom half handler but also for > clearing/suspending interrupt on device side. However, AFAIK, there is > no such possibility in the MHI protocol. Since the interrupt is not I think Linux side improvements would always be welcome, but have you looked at BEI and INTMODT? They are features defined in the MHI spec for addressing interrupt storms. > handled in the hard irq handler, it is triggered again once interrupt > are re-enabled, and even during the tasklet execution... at the end, > that makes a lot of unnecessary interrupts, that introduce latency and > participate to system load... > > I added some printk to highlight that issue: > [11564.689202] mhi_irq_handler 55d32b8 > [11564.689485] mhi_irq_handler 55d32b8 > [11564.690011] mhi_irq_handler 55d32b8 > [11564.690397] [55d32b8] mhi_process_data_event_ring start > [11564.690667] mhi_irq_handler 55d32b8 > [11564.690937] mhi_irq_handler 55d32b8 > [11564.691207] mhi_irq_handler 55d32b8 > [11564.691475] mhi_irq_handler 55d32b8 > [11564.692076] [55d32b8] mhi_process_data_event_ring done > [...] > > I see two solutions to fix that problem: > - Manage events directly in the hard-irq handler (no more tasklet) > - Use threaded IRQ with IRQF_ONESHOT flag, to keep interrupt masked > until threaded handler has completed. > > Regards, > Loic > -- Jeffrey Hugo Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: The MHI interrupt handling issue 2020-12-07 15:48 ` Jeffrey Hugo @ 2020-12-07 17:02 ` Loic Poulain 2020-12-07 21:07 ` Bhaumik Bhatt 0 siblings, 1 reply; 4+ messages in thread From: Loic Poulain @ 2020-12-07 17:02 UTC (permalink / raw) To: Jeffrey Hugo Cc: Manivannan Sadhasivam, Hemant Kumar, Bhaumik Bhatt, linux-arm-msm Hi Jeffrey, On Mon, 7 Dec 2020 at 16:48, Jeffrey Hugo <jhugo@codeaurora.org> wrote: > > On 12/7/2020 6:20 AM, Loic Poulain wrote: > > Hi folks, > > > > Before putting my hands into that, I wanted to expose a MHI interrupt > > problem, comments are welcome. > > > > Currently, the hard IRQ handler for event rings do nothing except > > triggering a tasklet as bottom half that in turn will take care of > > retrieving buffer(s). That leads to have an unexpected high amount of > > interrupts when I perform throughput testing with mhi-net (though it > > applies for any mhi client driver). > > > > The point is that usually, an hard interrupt handler is responsible > > for triggering the bottom half handler but also for > > clearing/suspending interrupt on device side. However, AFAIK, there is > > no such possibility in the MHI protocol. Since the interrupt is not > > I think Linux side improvements would always be welcome, but have you > looked at BEI and INTMODT? They are features defined in the MHI spec > for addressing interrupt storms. Yes, that interrupt coalescing feature is working well, and I use it in that context. But Actually the problem is not really that the device generates too many interrupts, but that the driver does not mask the interrupt while handling it, causing replicated interrupts, and so useless hard interrupt handler executions. I need to investigate how bad it impact the system/transfers though. > > > > handled in the hard irq handler, it is triggered again once interrupt > > are re-enabled, and even during the tasklet execution... at the end, > > that makes a lot of unnecessary interrupts, that introduce latency and > > participate to system load... > > > > I added some printk to highlight that issue: > > [11564.689202] mhi_irq_handler 55d32b8 > > [11564.689485] mhi_irq_handler 55d32b8 > > [11564.690011] mhi_irq_handler 55d32b8 > > [11564.690397] [55d32b8] mhi_process_data_event_ring start > > [11564.690667] mhi_irq_handler 55d32b8 > > [11564.690937] mhi_irq_handler 55d32b8 > > [11564.691207] mhi_irq_handler 55d32b8 > > [11564.691475] mhi_irq_handler 55d32b8 > > [11564.692076] [55d32b8] mhi_process_data_event_ring done > > [...] > > > > I see two solutions to fix that problem: > > - Manage events directly in the hard-irq handler (no more tasklet) > > - Use threaded IRQ with IRQF_ONESHOT flag, to keep interrupt masked > > until threaded handler has completed. > > > > Regards, > > Loic ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: The MHI interrupt handling issue 2020-12-07 17:02 ` Loic Poulain @ 2020-12-07 21:07 ` Bhaumik Bhatt 0 siblings, 0 replies; 4+ messages in thread From: Bhaumik Bhatt @ 2020-12-07 21:07 UTC (permalink / raw) To: Loic Poulain Cc: Jeffrey Hugo, Manivannan Sadhasivam, Hemant Kumar, linux-arm-msm On 2020-12-07 09:02 AM, Loic Poulain wrote: > Hi Jeffrey, > > On Mon, 7 Dec 2020 at 16:48, Jeffrey Hugo <jhugo@codeaurora.org> wrote: >> >> On 12/7/2020 6:20 AM, Loic Poulain wrote: >> > Hi folks, >> > >> > Before putting my hands into that, I wanted to expose a MHI interrupt >> > problem, comments are welcome. >> > >> > Currently, the hard IRQ handler for event rings do nothing except >> > triggering a tasklet as bottom half that in turn will take care of >> > retrieving buffer(s). That leads to have an unexpected high amount of >> > interrupts when I perform throughput testing with mhi-net (though it >> > applies for any mhi client driver). >> > >> > The point is that usually, an hard interrupt handler is responsible >> > for triggering the bottom half handler but also for >> > clearing/suspending interrupt on device side. However, AFAIK, there is >> > no such possibility in the MHI protocol. Since the interrupt is not >> >> I think Linux side improvements would always be welcome, but have you >> looked at BEI and INTMODT? They are features defined in the MHI spec >> for addressing interrupt storms. > > Yes, that interrupt coalescing feature is working well, and I use it > in that context. But Actually the problem is not really that the > device generates too many interrupts, but that the driver does not > mask the interrupt while handling it, causing replicated interrupts, > and so useless hard interrupt handler executions. I need to > investigate how bad it impact the system/transfers though. > > >> >> >> > handled in the hard irq handler, it is triggered again once interrupt >> > are re-enabled, and even during the tasklet execution... at the end, >> > that makes a lot of unnecessary interrupts, that introduce latency and >> > participate to system load... >> > >> > I added some printk to highlight that issue: >> > [11564.689202] mhi_irq_handler 55d32b8 >> > [11564.689485] mhi_irq_handler 55d32b8 >> > [11564.690011] mhi_irq_handler 55d32b8 >> > [11564.690397] [55d32b8] mhi_process_data_event_ring start >> > [11564.690667] mhi_irq_handler 55d32b8 >> > [11564.690937] mhi_irq_handler 55d32b8 >> > [11564.691207] mhi_irq_handler 55d32b8 >> > [11564.691475] mhi_irq_handler 55d32b8 >> > [11564.692076] [55d32b8] mhi_process_data_event_ring done >> > [...] >> > >> > I see two solutions to fix that problem: >> > - Manage events directly in the hard-irq handler (no more tasklet) >> > - Use threaded IRQ with IRQF_ONESHOT flag, to keep interrupt masked >> > until threaded handler has completed. >> > >> > Regards, >> > Loic I remember from an earlier conversation with Jeff and Mani that IRQF_ONESHOT cannot be used when a IRQF_SHARED flag is also present when we have a single shared IRQ line. Jeff has this use case where BHI intvec and rest of the MHI event rings are sharing the same IRQ line. We have been using napi_poll() with 5msec INTMODT for high TPUT data transfers. Thanks, Bhaumik --- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-12-07 21:08 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-12-07 13:20 The MHI interrupt handling issue Loic Poulain 2020-12-07 15:48 ` Jeffrey Hugo 2020-12-07 17:02 ` Loic Poulain 2020-12-07 21:07 ` Bhaumik Bhatt
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.