e1000e: Fix possible interrupt loss when using MSI
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> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
5288bee45f
commit
dd0ef12866
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user