Message ID | 20220720111303.10628-1-ake@igel.co.jp |
---|---|
State | New |
Headers | show |
Series | e1000e: Fix possible interrupt loss when using MSI | expand |
On Wed, Jul 20, 2022 at 7:14 PM Ake Koomsin <ake@igel.co.jp> wrote: > > Commit "e1000e: Prevent MSI/MSI-X storms" introduced msi_causes_pending > to prevent interrupt storms problem. It was tested with MSI-X. > > In case of MSI, the guest can rely solely on interrupts to clear ICR. > Upon clearing all pending interrupts, msi_causes_pending gets cleared. > However, when e1000e_itr_should_postpone() in e1000e_send_msi() returns > true, MSI never gets fired by e1000e_intrmgr_on_throttling_timer() > because msi_causes_pending is still set. This results in interrupt loss. > > To prevent this, we need to clear msi_causes_pending when MSI is going > to get fired by the throttling timer. The guest can then receive > interrupts eventually. > > Signed-off-by: Ake Koomsin <ake@igel.co.jp> I've queued this. Thanks > --- > hw/net/e1000e_core.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c > index 2c51089a82..208e3e0d79 100644 > --- a/hw/net/e1000e_core.c > +++ b/hw/net/e1000e_core.c > @@ -159,6 +159,8 @@ e1000e_intrmgr_on_throttling_timer(void *opaque) > > if (msi_enabled(timer->core->owner)) { > trace_e1000e_irq_msi_notify_postponed(); > + /* Clear msi_causes_pending to fire MSI eventually */ > + timer->core->msi_causes_pending = 0; > e1000e_set_interrupt_cause(timer->core, 0); > } else { > trace_e1000e_irq_legacy_notify_postponed(); > -- > 2.25.1 >
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c index 2c51089a82..208e3e0d79 100644 --- a/hw/net/e1000e_core.c +++ b/hw/net/e1000e_core.c @@ -159,6 +159,8 @@ e1000e_intrmgr_on_throttling_timer(void *opaque) if (msi_enabled(timer->core->owner)) { trace_e1000e_irq_msi_notify_postponed(); + /* Clear msi_causes_pending to fire MSI eventually */ + timer->core->msi_causes_pending = 0; e1000e_set_interrupt_cause(timer->core, 0); } else { trace_e1000e_irq_legacy_notify_postponed();
Commit "e1000e: Prevent MSI/MSI-X storms" introduced msi_causes_pending to prevent interrupt storms problem. It was tested with MSI-X. In case of MSI, the guest can rely solely on interrupts to clear ICR. Upon clearing all pending interrupts, msi_causes_pending gets cleared. However, when e1000e_itr_should_postpone() in e1000e_send_msi() returns true, MSI never gets fired by e1000e_intrmgr_on_throttling_timer() because msi_causes_pending is still set. This results in interrupt loss. To prevent this, we need to clear msi_causes_pending when MSI is going to get fired by the throttling timer. The guest can then receive interrupts eventually. Signed-off-by: Ake Koomsin <ake@igel.co.jp> --- hw/net/e1000e_core.c | 2 ++ 1 file changed, 2 insertions(+)