• Benjamin Poirier's avatar
    e1000e: Avoid receiver overrun interrupt bursts · 4aea7a5c
    Benjamin Poirier authored
    When e1000e_poll() is not fast enough to keep up with incoming traffic, the
    adapter (when operating in msix mode) raises the Other interrupt to signal
    Receiver Overrun.
    
    This is a double problem because 1) at the moment e1000_msix_other()
    assumes that it is only called in case of Link Status Change and 2) if the
    condition persists, the interrupt is repeatedly raised again in quick
    succession.
    
    Ideally we would configure the Other interrupt to not be raised in case of
    receiver overrun but this doesn't seem possible on this adapter. Instead,
    we handle the first part of the problem by reverting to the practice of
    reading ICR in the other interrupt handler, like before commit 16ecba59
    ("e1000e: Do not read ICR in Other interrupt"). Thanks to commit
    0a8047ac ("e1000e: Fix msi-x interrupt automask") which cleared IAME
    from CTRL_EXT, reading ICR doesn't interfere with RxQ0, TxQ0 interrupts
    anymore. We handle the second part of the problem by not re-enabling the
    Other interrupt right away when there is overrun. Instead, we wait until
    traffic subsides, napi polling mode is exited and interrupts are
    re-enabled.
    Reported-by: default avatarLennart Sorensen <lsorense@csclub.uwaterloo.ca>
    Fixes: 16ecba59 ("e1000e: Do not read ICR in Other interrupt")
    Signed-off-by: default avatarBenjamin Poirier <bpoirier@suse.com>
    Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    4aea7a5c
defines.h 35.5 KB